一尘不染

Python - 解决内存泄漏问题

python

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

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

具体情况详解

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

更新

Gnibbler 的回答实际上让我发现存储每次计算期间使用的所有数据的 ClosenessCalculation 对象并没有被杀死。然后我用它来手动删除一些似乎已经解决了内存问题的链接。


阅读 92

收藏
2022-06-22

共1个答案

一尘不染

您可以使用类似的东西来帮助追踪内存泄漏

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

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

>>> 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)]

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

2022-06-22