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

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

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

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

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

5 Solutions collect form web for “Почему Python «Ошибка памяти» с списком `append ()` осталось много ОЗУ”

Если вы используете 32-битную сборку Python, вы можете попробовать 64-разрядную версию.

Процесс может обрабатывать не более 4 ГБ ОЗУ с использованием 32-разрядных адресов, но обычно (в зависимости от ОС) получается намного меньше. Похоже, ваш Python-процесс может поразить этот предел. 64-разрядная адресация устраняет это ограничение.

edit Поскольку вы спрашиваете о Windows, следующая страница имеет значение: Пределы памяти для выпуска Windows . Как вы можете видеть, ограничение на 32-битный процесс составляет 2, 3 или 4 ГБ в зависимости от версии ОС и конфигурации.

Если вы готовы к реструктуризации кода вместо того, чтобы бросать в него больше памяти, вы можете пройти с этим:

 data = (processraw(raw) for raw in lines) 

где lines – это либо список строк, либо file.xreadlines() или аналогичный.

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

Полностью бесплатное решение, которое я реализовал, было

1) Установите VirtualBox
2) Установите CentOS 5.6 на виртуальную машину
3) Получите Enthought Python Distribution (бесплатная 64-битная версия Linux).

Теперь все мои зависимые от пинг-кода Numpy, Scipy и Matplotlib могут использовать столько же памяти, сколько у меня есть Ram и доступная подкачка Linux.

У меня была аналогичная проблема, возникающая при оценке выражения, содержащего большие массивы 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 ГБ!

Как уже упоминалось, вам понадобится бит python64 (64-разрядной версии Windows).

Имейте в виду, что вы, вероятно, столкнетесь с множеством конфликтов и проблем с некоторыми из базовых пакетов, с которыми вы, возможно, захотите работать. чтобы избежать этой проблемы, я бы рекомендовал Anaconda из Continuum Analytics. Я бы посоветовал вам заглянуть в него 🙂

  • Как найти общие элементы в списке списков?
  • Учитывая список имен переменных в Python, как мне создать словарь с именами переменных в виде ключей (к значениям переменных)?
  • Покажите мне несколько классных понятий python list
  • Как отсортировать многомерный массив по столбцу?
  • Python - найти элемент с максимальными вхождениями в список
  • Поиск медианы списка в Python
  • Удалить пунктуацию из списка
  • Python: Получить индекс словаря в списке
  • Почему «.sort ()» вызывает список «None» в Python?
  • Нарезка списка с использованием переменной в Python
  • Как использовать список запросов в python
  • Python - лучший язык программирования в мире.