Python内存漏洞追踪?

Ven*_*tta 7 python memory memory-leaks

不知何故,我的Python程序在运行时("顶部"命令的VIRT和RES)列占用越来越多的内存.

但是,我非常小心地仔细检查了我的代码,我确信没有内存泄漏(没有使用任何字典,没有全局变量.它只是一个主方法多次调用子方法).

我使用heapy来分析我的内存使用情况

from guppy import hpy;
heap = hpy();
.....
print heap.heap();
Run Code Online (Sandbox Code Playgroud)

每次main方法调用sub方法.令人惊讶的是,它始终提供相同的输出.但内存使用量不断增长.

我想知道我是不是没有使用heapy,或者"top"命令中的VIRT和RES不能真正反映我的代码使用的内存吗?

或者任何人都可以提供更好的方法来追踪Python脚本中的内存使用情况?

非常感谢!

gur*_*lex 1

两种可能的情况:

  • 你的函数是纯Python,在这种情况下可能的原因包括

    • 您正在存储越来越多的大型物体
    • 你有一个带有__del__方法的对象循环,gc 不会触及该方法

    我建议使用gc模块和gc.garbageandgc.get_objects函数(请参阅http://docs.python.org/library/gc.html#module-gc)来获取现有对象的列表,然后您可以通过查看来内省它们__class__例如,每个对象的属性以获取有关该对象的类的信息。

  • 您的函数至少部分是用 C / C++ 编写的,在这种情况下,问题可能出在该代码中。上面的建议仍然适用,但无法看到所有泄漏:您将看到由于缺少对 PY_DECREF 的调用而导致的泄漏,但不会看到没有相应释放的低级 C/C++ 分配。为此你需要 valgrind。有关该主题的更多信息,请参阅此问题