Как отладить MemoryError в Python? Инструменты для отслеживания использования памяти?

У меня есть программа Python, которая умирает с MemoryError, когда я кормлю ее большим файлом. Существуют ли какие-либо инструменты, которые я мог бы использовать, чтобы понять, что использует память?

Эта программа отлично работает на небольших входных файлах. Очевидно, что программа нуждается в улучшении масштабируемости; Я просто пытаюсь выяснить, где. "Тест, прежде чем вы оптимизируете", как однажды сказал мудрый человек.

(Только для предотвращения неизбежного ответа "добавить больше оперативной памяти": это работает в 32-разрядном окне WinXP с 4 ГБ оперативной памяти, поэтому Python имеет доступ к 2 ГБ полезной памяти. Добавление большего объема памяти технически невозможно. ПК с 64-битной Windows не является практичным.)

EDIT: Ой, это дубликат Какой профилер памяти Python рекомендуется?

Ответ 1

Heapy является профилировщиком памяти для Python, который является типом необходимого вам инструмента.

Ответ 2

Простейшим и легким способом, вероятно, будет использование встроенных возможностей запроса памяти на Python, например sys.getsizeof - просто запустить это на ваших объектах для уменьшения проблемы (т.е. меньшего файла) и посмотреть, что занимает много памяти.

Ответ 3

В вашем случае ответ, вероятно, очень прост: не читайте весь файл сразу, а обрабатывайте кусок файла куском. Это может быть очень легко или сложно в зависимости от вашего сценария использования. Например, вычисление контрольных сумм MD5 может быть сделано гораздо более эффективно для огромных файлов без чтения всего файла. Последнее изменение значительно сократило потребление памяти в некоторых сценариях использования SCons, но почти невозможно было отслеживать с помощью профилировщика памяти.

Если вам по-прежнему нужен профайлер памяти: eliben уже предложил sys.getsizeof. Если это не разрезает, попробуйте Heapy или Pympler.

Ответ 4

Вы попросили рекомендацию по инструменту:

Python Memory Validator позволяет отслеживать использование памяти, места размещения, коллекции GC, экземпляры объектов, снимки памяти и т.д. вашего приложения Python. Только Windows.

http://www.softwareverify.com/python/memory/index.html

Отказ от ответственности: я участвовал в создании этого программного обеспечения.