【发布时间】:2010-12-11 02:31:26
【问题描述】:
我有一个 Python 程序,它运行一系列实验,没有打算将数据从一个测试存储到另一个测试。我的代码包含一个我完全找不到的内存泄漏(我查看了关于内存泄漏的other threads)。由于时间限制,我不得不放弃寻找泄漏,但如果我能够隔离每个实验,该程序可能会运行足够长的时间来产生我需要的结果。
- 在单独的线程中运行每个测试会有帮助吗?
- 还有其他方法可以隔离泄漏的影响吗?
具体情况详解
- 我的代码有两部分:实验运行器和实际实验代码。
- 虽然运行所有实验的代码和每个实验使用的代码之间没有共享全局变量,但某些类/函数必须共享。
- 实验运行器不仅仅是一个可以轻松放入 shell 脚本的简单 for 循环。它首先根据配置参数决定需要运行的测试,然后运行测试,然后以特定方式输出数据。
- 我尝试手动调用垃圾收集器,以防问题仅仅是没有运行垃圾收集,但这不起作用
更新
Gnibbler 的回答实际上让我发现我的 ClosenessCalculation 对象存储了所有在每次计算期间使用的数据并没有被杀死。然后我用它手动删除了一些似乎已经解决了内存问题的链接。
【问题讨论】:
-
在python中定义“内存泄漏”。
-
我的意思是,你不可能“忘记”释放任何内存;它是 GCed。
-
你怎么知道你有内存泄漏?是不是您的进程内存增长到很大,并且从不缩小?如果是这样,请注意 Python 不一定会因为不再使用内存而将内存返回给操作系统。
-
它不仅在增长,而且还在不断变大
-
您几乎可以在任何编程语言中出现“内存泄漏”:即使是带有 GC 的语言——这只是由于缺乏回收而导致的可用内存减少以前的分配(在支持 GC 的语言中,这仅仅意味着 [和越来越多的] 对象永远不会有资格进行回收)。没错,GC 通过消除巨大的负担让编程变得更容易,但它并没有消除糟糕的代码或糟糕的设计。
标签: python memory-leaks