Как я могу найти утечки памяти в моей программе Python?

Возможный дубликат:
профилировщик памяти Python

У меня есть довольно сложная (около 20 000) строчная программа Python, которая после некоторой разработки начала потреблять все больше памяти при запуске. Каковы лучшие инструменты и методы определения того, для чего используется вся память?

Обычно это сводится либо к неожиданному сохранению ссылок на объекты, либо к ошибкам модуля расширения (что маловероятно, поскольку мы некоторое время использовали установку Python 2.4).

Мы используем различные сторонние библиотеки, такие как Twisted, Twisted Conch и MySQLdb.


person Dickon Reed    schedule 10.02.2009    source источник


Ответы (2)


Как правило, отсутствие закрытия курсоров - один из наиболее распространенных видов утечек памяти. Сборщик мусора не может видеть ресурсы MySQL, задействованные в курсоре. MySQL не знает, что сторона Python была выпущена, если явно не вызывается метод close().

Практическое правило. Открывайте, используйте и закрывайте курсоры в максимально короткий промежуток кода.

person S.Lott    schedule 10.02.2009
comment
Я пытался выяснить, почему моя система не высвобождает ресурсы в программе, и это было именно то. Такая мелочь, но при выполнении тысяч запросов к БД она быстро становится большой! - person Shakesbeery; 22.12.2014
comment
Похоже, вам следует использовать оператор with и класс, подобный RAII, чтобы вы не могли забыть закрыть, даже если возникают исключения. - person Jesse Pepper; 17.10.2017

Память Python управляется сборщиком мусора. В общем, проблем с утечкой памяти быть не должно (определенно не для Python2.5 и выше), если только вы не пишете модули расширения на C / C ++. В этом случае Valgrind (сообщение в блоге - http://bruynooghe.blogspot.com/2008/12/finding-memory-leaks-in-python.html) может оказаться полезным. Я обнаружил, что этот человек - http://mg.pov.lt/blog/hunting-python-memleaks использовал PDB и matplotlib для отслеживания утечки памяти. Надеюсь, это поможет, у меня нет опыта исправления утечек памяти Python.

person batbrat    schedule 10.02.2009
comment
В сложной программе иногда вы сохраняете ссылку на объект, даже не осознавая этого. Это делает сборщик мусора неспособным освободить память. То, как вопрос, на который ссылается Себастьян, лучше; что я действительно хочу, так это увидеть, где используется моя память. - person Dickon Reed; 10.02.2009