2012-06-28 2 views
7

Я использую numpy для создания массива кубов со сторонами длины 100, что содержит 1 миллион записей. Для каждого из миллионов записей я вставляю матрицу 100x100, записи которой состоят из случайно сгенерированных чисел. Я использую следующий код, чтобы сделать это:Сколько памяти в массиве numpy? ОЗУ является ограничивающим фактором?

import random 
from numpy import * 

cube = arange(1000000).reshape(100,100,100) 

for element in cube.flat: 
    matrix = arange(10000).reshape(100,100) 
    for entry in matrix.flat: 
     entry = random.random()*100 
    element = matrix 

Я ожидал, что это займет некоторое время, но с 10 миллиардов случайных чисел генерируются, я не уверен, что мой компьютер может даже справиться с этим. Сколько памяти будет занимать такой массив? Будет ли ОЗУ предельным фактором, то есть, если на моем компьютере не хватает ОЗУ, может ли он не сгенерировать массив?

Кроме того, если есть более эффективно реализовать этот код, я был бы признателен за советы :)

+4

Предполагая, что 'double' точность, по 8 байт каждый, если вы действительно пытаются сохранить 10 миллиардов из них, это 80GB. Если вам нужно спросить, на вашем компьютере недостаточно памяти. Тем не менее, похоже, что вы создаете их все, но не храните их, поэтому все должно быть в порядке. – Gabe

ответ

17

Пара очков:

  • Размер в памяти Numpy массивов легко вычислить. Это просто количество элементов, умноженное на размер данных, плюс небольшие постоянные накладные расходы. Например, если ваш cube.dtype равен int64, и он имеет 1 000 000 элементов, для этого потребуется 1000000 * 64/8 = 8,000,000 байт (8 МБ).
  • Однако, как отмечает @Gabe, 100 * 100 * 1 000 000 двухместных номеров потребуют около 80 Gb.
  • Это не приведет к чему-либо «сломать», но операции будут смехотворно медленными из-за всего swapping, который должен будет выполнить ваш компьютер.
  • Ваши петли не будут делать то, что вы ожидаете. Вместо замены элемента в cube, element = matrix просто перезапишет переменную element, оставив cube без изменений. То же самое касается entry = random.rand() * 100.
  • Вместо см: http://docs.scipy.org/doc/numpy/reference/arrays.nditer.html#modifying-array-values
+1

Вещи действительно «ломаются», если вы превысите общее количество доступной виртуальной памяти, что кажется очень вероятным в этом случае, так как не многие люди имеют> 80 ГБ пространства подкачки. –

+0

Это не совсем так, когда речь идет о таких функциях, как 'np .zeros() '. Используется ленивая загрузка (по крайней мере, в версиях Linux), которая позволит избежать использования больших объемов памяти до тех пор, пока не будут доступны определенные элементы. Например, вы можете создать матрицу с 'np.zeros ((24000,24000))', и она не занимает много памяти, но если вы делаете 'np.random.random ((24000,24000))', он занимает немного больше 4 ГБ. Лучшее объяснение: https://stackoverflow.com/questions/27574881/why-does-numpy-zeros-takes-up-little-space –

2

для "внутренней" части вашей функции, обратите внимание на модуль numpy.random

import numpy as np 
matrix = np.random.random((100,100))*100 
Смежные вопросы