Python - 解决内存泄漏问题

Cas*_*ash 30 python memory-leaks

我有一个Python程序,它运行一系列实验,没有数据打算从一个测试存储到另一个测试.我的代码包含一个我完全无法找到的内存泄漏(我看看内存泄漏的其他线程).由于时间限制,我不得不放弃寻找泄漏,但如果我能够隔离每个实验,程序可能会运行足够长的时间来产生我需要的结果.

  • 在单独的线程中运行每个测试有帮助吗?
  • 有没有其他方法来隔离泄漏的影响?

具体情况详情

  • 我的代码有两部分:实验运行器和实际的实验代码.
  • 尽管在运行所有实验的代码和每个实验使用的代码之间没有共享全局变量,但是必须共享某些类/函数.
  • 实验运行器不仅仅是一个简单的for循环,可以很容易地放入shell脚本中.它首先决定在给定配置参数的情况下需要运行的测试,然后运行测试然后以特定方式输出数据.
  • 我试图手动调用垃圾收集器,以防问题只是垃圾收集没有运行,但这不起作用

更新

Gnibbler的答案实际上让我发现我的ClosenessCalculation对象存储了每次计算中使用的所有数据都没有被删除.然后我用它来手动删除一些似乎已修复内存问题的链接.

Joh*_*ooy 60

你可以使用这样的东西来帮助追踪内存泄漏

>>> from collections import defaultdict
>>> from gc import get_objects
>>> before = defaultdict(int)
>>> after = defaultdict(int)
>>> for i in get_objects():
...     before[type(i)] += 1 
... 
Run Code Online (Sandbox Code Playgroud)

现在假设测试泄漏了一些内存

>>> leaked_things = [[x] for x in range(10)]
>>> for i in get_objects():
...     after[type(i)] += 1
... 
>>> print [(k, after[k] - before[k]) for k in after if after[k] - before[k]]
[(<type 'list'>, 11)]
Run Code Online (Sandbox Code Playgroud)

因为我们泄露了一个包含10个以上列表的列表