Большой, редкий список списков, дающих MemoryError при вызове np.array (data) - PullRequest
1 голос
/ 18 марта 2012

У меня большая матрица 0 с и 1 с, то есть в основном 0 с.Первоначально он хранится в виде списка 25 thousand других списков, каждый из которых имеет длину около 2000 дюймов.

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

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

1 Ответ

1 голос
/ 18 марта 2012

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

25000*2000*2/1000000 = 100 MB

Это прекрасно работает на моем компьютере (4 ГБ ОЗУ):

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

Можете ли вы создать приведенную выше матрицу нулей?

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

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


РЕДАКТИРОВАТЬ: ответ на комментарий ОП.

У меня есть 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=",")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...