вывести все доступные кортежи в python из отладчика - PullRequest
8 голосов
/ 01 марта 2011

Я понял, что в одном скрипте Python есть утечка памяти.Который сначала занимал около 25 МБ, а через 15 дней - более 500 МБ.

Я следовал по-разному и не смог понять суть проблемы, как новичок в питоне ...

Наконец-то я получил следующее

objgraph.show_most_common_types(limit=20)
tuple                      37674
function                   9156
dict                       3935
list                       1646
wrapper_descriptor         1468
weakref                    888
builtin_function_or_method 874
classobj                   684
method_descriptor          551
type                       533
instance                   483
Kind                       470
getset_descriptor          404
ImmNodeSet                 362
module                     342
IdentitySetMulti           333
PartRow                    331
member_descriptor          264
cell                       185
FontEntry                  170

Я установил точку останова, и после каждой итерации это то, что происходит ...

objgraph.show_growth()
tuple    37674       +10

Каков наилучший способ продолжить?

(Pdb) c
(Pdb) objgraph.show_growth()
tuple    37684       +10

Я думаю, распечаткавсе кортежи и перекрестная проверка - что эти 10 кортежей добавляются каждый раз, даст мне некоторую подсказку?Пожалуйста, дайте мне знать, как это сделать ..

Или есть какой-нибудь другой способ обнаружить эту утечку памяти.Я использую Python 2.4.3, и из-за многих других зависимостей продукта - К сожалению, я не могу / не должен обновлять.

Ответы [ 2 ]

2 голосов
/ 01 марта 2011

Правильно ли я понимаю, что один и тот же сценарий работает без перерыва в течение 15 дней?

Для таких длительных процессов периодический перезапуск является хорошей практикой, и его гораздо проще сделать, чем устранить все утечки памяти.

Обновление : посмотрите на этот ответ , похоже, он делает именно то, что вам нужно - напечатать все вновь добавленные объекты, которые не были собраны сборщиком мусора.

0 голосов
/ 01 марта 2011

Моя первая мысль: возможно, вы создаете новые объекты в своем скрипте и накапливаете их в каком-то глобальном списке.Обычно проще пройтись по сценарию и убедиться, что вы не генерируете постоянные данные, чем отлаживаете мусор.Я думаю, что утилита objgraph, которую вы используете, также позволяет вам печатать мусорный объект с количеством ссылок на него.Вы можете попробовать это.

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