У меня есть матричный (плавающий) файл размером 50 000x5 000. при использовании x = np.genfromtxt(readFrom, dtype=float) для загрузки файла в память я получаю следующее сообщение об ошибке:
Файл "C:\Python27\lib\site-packages\numpy\lib\npyio.py", строка 1583, в genfromtxt для (i, конвертер) в enumerate(конвертеры)])
MemoryError
Я хочу загрузить весь файл в память, потому что я вычисляю евклидово расстояние между каждым вектором, используя Scipy. dis = scipy.spatial.distance.euclidean(x[row1], x[row2])
Есть ли эффективный способ загрузить в память огромный файл матрицы.
Спасибо.
Update:
Мне удалось решить проблему. Вот мое решение. Я не уверен, эффективно ли это или логически правильно, но у меня работает нормально:
x = open(readFrom, 'r').readlines()
y = np.asarray([np.array(s.split()).astype('float32') for s in x], dtype=np.float32)
....
dis = scipy.spatial.distance.euclidean(y[row1], y[row2])
Пожалуйста, помогите мне улучшить мое решение.
Ответ 1 · рейтинг 1 · Luke
В зависимости от вашей ОС и версии Python вполне вероятно, что вы никогда не сможете выделить массив размером 1 ГБ (здесь есть ответ mgilson). Проблема не в том, что вам не хватает памяти, а в том, что вам не хватает непрерывной памяти. Если вы работаете на 32-битной машине (особенно под управлением Windows), добавление памяти не поможет. Переход на 64-битную архитектуру, вероятно, поможет.
Использование меньших типов данных, безусловно, может помочь; в зависимости от операций, которые вы используете, может быть достаточно 16-битного числа с плавающей запятой или даже 8-битного целого числа.
Если ничего из этого не работает, то вы вынуждены признать, что данные просто не помещаются в памяти. Вам придется обрабатывать его по частям (в этом случае хранение данных в виде массива HDF5 может быть очень полезным).
Ответ 2 · рейтинг 1 · mgilson
На самом деле вы используете 8-байтовые числа с плавающей запятой, поскольку float python соответствует double C (по крайней мере, в большинстве систем):
a=np.arange(10,dtype=float)
print(a.dtype) #np.float64
Вы должны указать свой тип данных как np.float32. В зависимости от вашей ОС и от того, является ли она 32-битной или 64-битной (и используете ли вы 32-битный Python или 64-битный Python), адресное пространство, доступное для использования numpy, может быть меньше, чем ваши 4 ГБ, что также может быть проблемой здесь .