2015-02-13 4 views
2

Когда я использую следующий код, чтобы загрузить файл CSV с помощью NumPyОшибка памяти при использовании Numpy текст нагрузки

F = np.loadtxt(F,skiprows=1, delimiter=',',usecols=(2,4,6)) 
MASS = F[:,4] 
#print(MASS) 
Z = F[:,6] 
N = len(MASS) 
print(len(MASS)) 

Я получаю следующую ошибку

Traceback (most recent call last): 
File "C:\Users\Codes\test2.py", line 16, in <module> 
F = np.loadtxt(F,skiprows=1, delimiter=',',usecols=(2,4,6)) 
File "C:\Python34\lib\site-packages\numpy\lib\npyio.py", line 859, in loadtxt 
X.append(items) 
MemoryError 

У меня есть 24ГБ, если физическая память и файл - 2.70Gb, поэтому я не понимаю, почему я получаю эту ошибку. Благодаря!

EDIT

Я также попытался загрузить тот же файл, как этот

f = open(F)   #Opens file 
f.readline()   # Strips Header 
nlines = islice(f, N) #slices file to only read N lines 


for line in nlines:    
if line !='': 
     line = line.strip() 
     line = line.replace(',',' ') #Replace comma with space 
     columns = line.split() 
     tid = columns[2] 
     m = columns[4] 
     r = columns[6]    # assigns variable to columns 
     M.append(m) 
     R.append(r)      #appends data in list 
     TID.append(tid) 



print(len(MASS))  

и получил другую ошибку памяти.

Traceback (most recent call last): 
    File "C:\Users\Loop test.py", line 58, in <module> 
    M.append(m) 
    MemoryError 

Похоже, что в этом случае он работает из памяти при создании первого списка M

+3

распределение массива 2.70Gb проблематично. Он должен быть 2,70 ГБ ** непрерывной ** памяти. Любая машина будет бороться с этим. Я бы рекомендовал найти способ обработки этих данных в кусках. Или загляните в функциональность memmap numpy: http://docs.scipy.org/doc/numpy/reference/generated/numpy.memmap.html –

+4

Вам нужно всего 2.7 ГБ непрерывной * виртуальной * памяти, и не должно быть никаких проблем с этим, так как виртуальное адресное пространство на современных машинах безумно велико. Скорее всего, 'loadtxt()' будет копировать данные, может быть несколько раз, и внутренне выделять больше данных, чем будет занимать исходный файл. –

+0

@SvenMarnach Есть ли способ проверить, что 'loadtext()' делает дополнительные копии? – Surfcast23

ответ

6

Прежде всего, я бы проверял, что вы на самом деле используете 64-битную сборку python. В Windows обычно приходится работать с 32-битными сборками даже в 64-битных системах.

Try:

import platform 
print(platform.architecture()[0]) 

Если вы видите 32bit, это ваша проблема. 32-разрядный исполняемый файл может обрабатывать только 2 ГБ памяти, поэтому у вас никогда не может быть массив (или другой объект) более 2 ГБ.


Однако loadtxt довольно неэффективно, потому что она работает путем создания в list, а затем преобразовать его в Numpy массив. Ваш пример кода делает то же самое. (pandas.read_csv является гораздо более эффективным и очень сильно оптимизированы, если вам посчастливилось иметь pandas вокруг.)

list гораздо меньше памяти эффективной структуры, чем Numpy массива. Он аналогичен массиву указателей. Другими словами, каждый элемент в списке имеет дополнительные 64 бита.

Вы можете улучшить это, используя numpy.fromiter, если вам нужен «более компактный» текстовый ввод-вывод. См. Python out of memory on large CSV file (numpy) для более полного обсуждения (бесстыдная пробка).


Тем не менее, я не думаю, что ваша проблема loadtxt. Я думаю, что это 32-битная сборка python.

+0

. Вы правильно сказали, что я запускаю' 32bit' версию 'Python 3.4 ', но 64-битная версия 'Python 3.3.2'. Должен ли я просто удалить и переустановить установку '64bit' версии' 3.4'? – Surfcast23

+0

@ Surfcast23 - Это полностью зависит от вас. Нет ничего плохого в использовании '3.3', если это то, что установлено как 64-битное и работает. –

1

Проблема я считаю, это требование непрерывной памяти для загрузки данных 2,7 Гб. Это скорее всего более 2,7 в памяти, так как из-за структуры данных и языковых утилит. Лучше использовать куски одного файла или использовать HDF5 как структуры данных. http://www.h5py.org/

Смежные вопросы