Утечка памяти в Python? - PullRequest
7 голосов
/ 25 июля 2011

Каким-то образом память, которую моя Python-программа занимает все больше и больше, по мере того, как она работает (столбец VIRT и RES) команды top, продолжает увеличиваться.

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

Я использовал heapy для профилирования использования памяти по

from guppy import hpy;
heap = hpy();
.....
print heap.heap();

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

Интересно, не правильно ли я использовал heapy, или VIRT и RES в команде "top" не отражают память, которую использует мой код?

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

Большое спасибо!

1 Ответ

1 голос
/ 25 июля 2011

Два возможных случая:

  • ваша функция - чистый Python, и в этом случае возможные причины включают

    • вы храните все большее количество крупных объектов
    • у вас есть циклы объектов с методом __del__, который gc не коснется

    Я бы предложил использовать модуль gc и gc.garbage иgc.get_objects функция (см. http://docs.python.org/library/gc.html#module-gc),, чтобы получить список существующих объектов, и вы можете затем проанализировать их, посмотрев атрибут __class__ каждого объекта, например, чтобы получить информацию о классе объекта.

  • ваша функция по крайней мере частично написана на C / C ++, и в этом случае проблема потенциально заключается в этом коде. Приведенный выше совет по-прежнему применим, но вы не сможете увидеть все утечки: вы будетесм. утечки, вызванные отсутствующими вызовами PY_DECREF, но не низкоуровневыми выделениями C / C ++ без соответствующего освобождения. Для этого вам понадобится valgrind. Для получения дополнительной информации по этой теме 27 *

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