Почему Python "Ошибка памяти" с списком `append()` осталось много ОЗУ
Я создаю большой словарь данных из набора текстовых файлов. Когда я читаю строки и обрабатываю их, я append(dataline)
в список.
В какой-то момент append()
генерируется исключение Memory Error
. Однако, наблюдая за запуском программы в диспетчере задач Windows, в момент сбоя я вижу доступным 4,3 ГБ и 1,1 ГБ бесплатно.
Таким образом, я не понимаю причину исключения.
Версия Python - 2.6.6. Я полагаю, единственная причина в том, что он не может использовать больше доступной ОЗУ. Если это так, возможно ли увеличить выделение?
Ответы
Ответ 1
Если вы используете 32-битную сборку Python, вы можете попробовать 64-разрядную версию.
Процесс может обрабатывать не более 4 ГБ ОЗУ с использованием 32-разрядных адресов, но обычно (в зависимости от ОС) получается намного меньше. Похоже, ваш Python-процесс может поразить этот предел. 64-разрядная адресация устраняет это ограничение.
edit. Поскольку вы спрашиваете о Windows, следующая страница имеет значение: Ограничения памяти для выпуска Windows, Как вы можете видеть, ограничение на 32-битный процесс составляет 2, 3 или 4 ГБ в зависимости от версии ОС и конфигурации.
Ответ 2
Если вы готовы к реструктуризации кода вместо того, чтобы бросать в него больше памяти, вы можете пройти с этим:
data = (processraw(raw) for raw in lines)
где lines
- либо список строк, либо file.xreadlines()
или аналогичный.
Ответ 3
У меня была аналогичная проблема с использованием 32-разрядной версии python в 64-битной среде Windows. Я попробовал 64-битную версию python для окон и очень быстро столкнулся с проблемами с библиотеками Scipy, скомпилированными для 64-битных окон.
Полностью бесплатное решение, которое я реализовал, было
1) Установите VirtualBox
2) Установите CentOS 5.6 на виртуальную машину
3) Получите Enthought Python Distribution (бесплатная 64-битная версия Linux).
Теперь все мои зависимые от пинг-кода Numpy, Scipy и Matplotlib могут использовать столько памяти, сколько у меня есть Ram и доступная подкачка Linux.
Ответ 4
У меня была аналогичная проблема при оценке выражения, содержащего большие массивы numpy
(фактически, один был разреженным). Я делал это на машине с 64 ГБ памяти, из которых только около 8 ГБ было в использовании, так что был удивлен, получив MemoryError
.
Оказалось, что моя проблема заключалась в трансляции формы массива: я непреднамеренно продублировал большое измерение.
Произошло что-то вроде этого:
- Я прошел массив с формой
(286577, 1)
, где ожидал (286577)
.
- Это было отложено из массива с формой
(286577, 130)
.
- Поскольку я ожидал
(286577)
, я применил [:,newaxis]
в выражении, чтобы довести его до (286577,1)
, чтобы он транслировался до (286577,130)
.
- Когда я прошел форму
(286577,1)
, однако, [:,newaxis]
произвел форму (286577,1,1)
, и оба массива были переданы в форме (286577,286577,130)
... удвоений. С двумя такими массивами, которые достигают примерно 80 ГБ!
Ответ 5
Как уже упоминалось, вам понадобится бит python64 (из 64-разрядной версии Windows).
Помните, что вы, вероятно, столкнетесь с множеством конфликтов и проблем с некоторыми базовыми пакетами, с которыми вы, возможно, захотите работать. чтобы избежать этой проблемы, я бы рекомендовал Anaconda из Continuum Analytics. Я бы посоветовал вам заглянуть в него:)