Python内存泄漏追踪?

标签 python memory memory-leaks

不知何故,我的 Python 程序在运行时占用的内存越来越多(VIRT 和 RES)“top”命令的列不断增加。

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

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

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

每次主方法调用子方法。令人惊讶的是,它总是给出相同的输出。但是内存使用量一直在增长。

我想知道我是否没有正确使用 heapy,或者“top”命令中的 VIRT 和 RES 并没有真正反射(reflect)我的代码使用的内存?

或者谁能提供一种更好的方法来跟踪 Python 脚本中的内存使用情况?

非常感谢!

最佳答案

两种可能的情况:

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

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

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

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

关于Python内存泄漏追踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6809947/

相关文章:

python - 显示基于元组的排序列表并在字典中循环

python - pandas:带有 loc[] 的 NaN 结果

javascript - Casperjs 不允许使用外部模块?

c++ - 加载共享库 : libCstd. so.1 时出错:无法打开共享对象文件:没有这样的文件或目录

android - 我的 Android 应用程序泄漏,我应该检查什么?

python - 在 keras 的预训练密集层之间添加 dropout 层

python - 找不到资源 u'tokenizers/punkt/english.pickle'

algorithm - 如何将网页浏览量与内存峰值相关联?

sql - 转储到 CSV/Postgres 内存

c - 为什么我在通过 int 强制转换后得到 EXC_BAD_ACCESS?