Почему 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 __init__ setattr на аргументах?
  • Преобразование Python списка строк в список кортежей
  • Вычитание по списку множеств
  • Как читать текстовый файл в список или массив с помощью Python
  • Python: элегантный способ удаления пустых списков из словаря Python
  • Сортировка списка списков по частоте элементов в Python 2.3
  • Удаление элемента из списка - во время итерации - что случилось с этой идиомой?
  •  
    Interesting Posts for Van-Lav

    преобразовать sql-список python в словарь

    определение функции одной строки python

    Как выполнить синтаксический анализ через бесконечную страницу прокрутки (например, Wallbase.cc/search/sky) с помощью Python?

    Является ли хорошей идеей использовать недокументированный публичный код из стандартной библиотеки Python?

    lxml в python, проанализировать из url

    Django rest изменить пароль пользователя

    PIL поворачивает цвета изображения (BGR -> RGB)

    Что происходит, если вы смешиваете старые и новые классы стиля в иерархии?

    Вращение OpenGL из вектора скорости

    Построение графиков в python без группировки данных

    Развертывание приложения matlab в Интернете с помощью python

    Найти группы захвата в пользовательском регулярном выражении

    Нет модуля с именем scipy.stats – Почему, несмотря на то, что scipy установлен

    Как изменить порядок ключей в python dict?

    Отключить / удалить аргумент в argparse

    Python - лучший язык программирования в мире.