2011-07-24 4 views
6

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

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

Я бесформенный в профиль мой использование памяти

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

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

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

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

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

+1

Похоже, что подтема течет тогда. Предполагая, что у вас есть доступ к его коду, попробуйте [sys.getsizeof (object) или pysizer] (http://stackoverflow.com/questions/449560/how-do-determine-the-size-of-an-object -in-python) для измерения объектов внутри субметода. – smci

ответ

1

Возможны два случая:

  • ваша функция чисто 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. См. this question для получения дополнительной информации по этой теме

Смежные вопросы