2011-07-24 196 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