2011-07-24 251 views
6

不知何故,我的Python程序佔用越來越多的內存,因爲它的運行(VIRT和RES)列的「頂部」命令不斷增加。Python內存泄漏跟蹤?

但是,我仔細檢查了我的代碼,我確信沒有內存泄漏(沒有使用任何字典,也沒有全局變量,它只是多次調用子方法的主要方法) )。

我用heapy通過

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

各主要方法調用子方法的時間來分析我的內存使用情況。令人驚訝的是,它總是給出相同的輸出。但內存使用量正在不斷增長。

我不知道我是否沒有使用heapy,或者「top」命令中的VIRT和RES沒有真正反映我的代碼使用的內存?

或者任何人都可以提供一個更好的方法來追蹤Python腳本中的內存使用情況嗎?

非常感謝!

+1

聽起來像子方法會泄漏。假設你有權訪問它的代碼,試試[sys.getsizeof(object)或者pysizer](http://stackoverflow.com/questions/449560/how-do-i-determine-the-size-of-an-object -in-python)來測量submethod中的對象。 – smci

回答

1

兩種可能情況:

  • 你的函數是純Python,在這種情況下,可能的原因包括

    • 要存儲大對象
    • 您有周期的越來越多的使用__del__方法的對象,其中gc不會觸碰

    我建議使用gc模塊和gc.garbagegc.get_objects函數(請參閱http://docs.python.org/library/gc.html#module-gc),以獲取現有對象的列表,然後您可以通過查看每個對象的__class__屬性來反思它們,以獲取有關對象的信息類。

  • 你的函數至少部分是用C/C++編寫的,在這種情況下,問題可能在代碼中。上述建議仍然適用,但無法看到所有泄漏:您將看到由於缺少對PY_DECREF的調用而導致的泄漏,但未發生相應的釋放,不會導致低級別的C/C++分配。爲此,你需要valgrind。有關該主題的更多信息,請參見this question