2012-03-18 3 views
1

У меня есть большая матрица 0 s и 1 s, то есть в основном 0 s. Он изначально хранится в виде списка из 25 thousand других списков, каждый из которых имеет длину около 2000 ints.Большой, редкий список списков, предоставляющих MemoryError при вызове np.array (данные)

Я пытаюсь помещать их в массив numpy, что и делает другой кусочек моей программы. Поэтому я запускаю training_data = np.array(data), но это возвращает MemoryError

Почему это происходит? Я предполагаю, что для обработки программы слишком много памяти (что удивительно для меня ..), но если это так, есть ли лучший способ сделать это?

ответ

1

A (short) integer берет два байта для хранения. Вы хотите 25 000 списков, каждый из которых имеет 2 000 целых чисел; что дает

25000*2000*2/1000000 = 100 MB 

Это прекрасно работает на моем компьютере (4 Гб RAM):

>>> import numpy as np 
>>> x = np.zeros((25000,2000),dtype=int) 

смог создать экземпляр выше матрицу нулей вы?

Вы читаете файл в списке списков Python и затем преобразуете его в массив numpy? Это плохая идея; он будет как минимум удваивать требования к памяти. Каков формат файлов ваших данных?

Для разреженных матриц scipy.sparse предоставляет различные альтернативные типы данных, которые будут намного эффективнее.


EDIT: ответ на комментарий ОП.

У меня есть 25000 экземпляров некоторого другого класса, каждый из которых возвращает список длиной около 2000. Я хочу, чтобы поместить все эти списки возвращаются в np.array.

Ну, вы как-то перейдете через 8 ГБ! Чтобы решить эту проблему, не делайте все эти манипуляции в памяти. Записывайте данные на диск по классу за раз, затем удаляйте экземпляры и читайте в файле с numpy.

Сначала делают

with open(..., "wb") as f: 
    f = csv.writer(f) 
    for instance in instances: 
     f.writerow(instance.data) 

Это будет записывать все ваши данные в файл CSV большой иш. Тогда вы можете просто использовать np.loadtxt:

numpy.loadtxt(open(..., "rb"), delimiter=",") 
+0

Путь более 100 МБ :) У меня 8 ГБ ОЗУ. – zebra

+0

К вашему правлению, да, я могу создать экземпляр этого – zebra

+0

. К вашему следующему редактированию у меня есть 25000 экземпляров какого-либо другого класса, каждый из которых возвращает список длиной около 2000. Я хочу, чтобы все эти списки были возвращены в np.array – zebra

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