Как мне пройти по большому набору данных в python без получения MemoryError? - PullRequest
10 голосов
/ 04 ноября 2010

У меня есть большая серия наборов растровых данных, представляющих месячные осадки за несколько десятилетий.Я написал скрипт на Python, который зацикливается на каждом растре и выполняет следующие действия:

  1. Преобразует растр в массив с замаскированным массивом,
  2. Выполняет множество алгебр массивов для вычисленияновый уровень воды,
  3. Записывает результат в выходной растр.
  4. Повтор

Скрипт представляет собой длинный список уравнений алгебры массивов, заключенный в оператор цикла.

Все работает хорошо, если я просто запускаю скрипт на небольшой части своих данных (скажем, за 20 лет), но если я пытаюсь обработать всю партию, я получаю MemoryError.Ошибка не дает больше информации, чем эта (за исключением того, что она выделяет строку в коде, из-за которой Python отказался).

К сожалению, я не могу легко обработать свои данные кусками - мне действительно нужнобыть в состоянии сделать все сразу.Это связано с тем, что в конце каждой итерации выход (уровень воды) возвращается в следующую итерацию в качестве начальной точки.

В настоящее время мое понимание программирования является очень базовым, но я подумал, что всеиз моих объектов просто будут перезаписаны в каждом цикле.Я (тупо?) Предположил, что если коду удалось один раз успешно выполнить цикл, то он должен иметь возможность бесконечного цикла без использования большего и большего количества памяти.

Я пытался читать различные фрагменты документации и обнаружил кое-чтоназывается "Сборщик мусора", но я чувствую, что я выхожу из глубины и мой мозг тает!Может ли кто-нибудь предложить некоторое базовое понимание того, что на самом деле происходит с объектами в памяти, когда мой код зацикливается?Есть ли способ освобождения памяти в конце каждого цикла, или есть какой-то более «питонический» способ кодирования, который вообще избегает этой проблемы?

Ответы [ 2 ]

5 голосов
/ 04 ноября 2010

Вам не нужно заботиться об управлении памятью, особенно о сборщике мусора, у которого есть очень специфическая задача, которую вы, скорее всего, даже не используете.Python всегда будет собирать память, которую он может, и повторно использовать ее.

Есть только две причины вашей проблемы: либо данные, которые вы пытаетесь загрузить, слишком велики, чтобы поместиться в память, либо ваши вычисления хранят данные где-то (список, dict, что-то постоянное между итерациями) и что хранилище растет и растет. Профилировщики памяти могут помочь найти это.

4 голосов
/ 04 ноября 2010

быстрый способ «заставить» сборщик мусора очистить временные объекты только для цикла - это оператор del:

for obj in list_of_obj:   
    data = obj.getData()  
    do_stuff(data)   
    del data 

это заставляет переводчика удалять и освобождать временные объекты. ПРИМЕЧАНИЕ: это не гарантирует, что программа не утечет и не израсходует память в других частях вычисления, это просто быстрая проверка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...