Подтвердить что ты не робот

Почему Python "Ошибка памяти" с списком `append()` осталось много ОЗУ

Я создаю большой словарь данных из набора текстовых файлов. Когда я читаю строки и обрабатываю их, я append(dataline) в список.

В какой-то момент append() генерируется исключение Memory Error. Однако, наблюдая за запуском программы в диспетчере задач Windows, в момент сбоя я вижу доступным 4,3 ГБ и 1,1 ГБ бесплатно.

Таким образом, я не понимаю причину исключения.

Версия Python - 2.6.6. Я полагаю, единственная причина в том, что он не может использовать больше доступной ОЗУ. Если это так, возможно ли увеличить выделение?

4b9b3361

Ответ 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. Я бы посоветовал вам заглянуть в него:)