2011-07-24 16 views
6

W jakiś sposób pamięć, którą mój program Python pobiera coraz więcej pamięci w trakcie działania (kolumna VIRT i RES) w poleceniu "góra" nadal rośnie.Poszukiwanie śladów pamięci Pythona?

Jednak dwukrotnie dokładnie sprawdziłem mój kod bardzo ostrożnie i jestem pewien, że nie ma wycieków pamięci (nie używano żadnego słownika, żadnych zmiennych globalnych .. Jest to tylko główna metoda wywoływania metody podrzędnej wiele razy).

użyłem heapy do profilu mojego użycie pamięci przez

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

każdym razem głównym wywołuje metodę sub. Co zaskakujące, zawsze daje taką samą wydajność. Ale zużycie pamięci wciąż rośnie.

Zastanawiam się, czy nie użyłem heapy, czy VIRT i RES w poleceniu "top" nie odzwierciedlają pamięci, której używa mój kod?

Czy ktoś może zapewnić lepszy sposób śledzenia użycia pamięci w skrypcie Pythona?

Wielkie dzięki!

+1

Wygląda na to, że podtlenek jest nieszczelny. Zakładając, że masz dostęp do jego kodu, spróbuj [sys.getsizeof (object) lub pysizer] (http://stackoverflow.com/questions/449560/how-do-i-determine-the-size-of-an-object -in-python) do mierzenia obiektów wewnątrz submetod. – smci

Odpowiedz

1

dwa możliwe przypadki:

  • czynność jest czysty Python, w którym to przypadku możliwe przyczyny to

    • jesteś przechowywania coraz większej liczby dużych obiektów
    • cykle
    • masz z obiekty z metodą __del__, których gc nie będzie dotykać

    Sugeruję użycie modułu gc i funkcji gc.garbage i gc.get_objects (zobacz http://docs.python.org/library/gc.html#module-gc), aby uzyskać listę istniejących obiektów, a następnie można je introspekcyjnie przeanalizować atrybut __class__ każdego obiektu, na przykład w celu uzyskania informacji o obiekcie. klasa.

  • Twoja funkcja jest przynajmniej częściowo napisana w języku C/C++, w którym to przypadku problem może znajdować się w tym kodzie. Powyższe porady nadal obowiązują, ale nie będą widoczne wszystkie wycieki: pojawią się wycieki spowodowane brakującymi połączeniami do PY_DECREF, ale nie przydziałami C/C++ niskiego poziomu bez odpowiedniej alokacji. Do tego będziesz potrzebował valgrind. Aby uzyskać więcej informacji na ten temat, zobacz: this question

Powiązane problemy