最近这一点刺痛了我。我通过删除代码中列表的numpy数组的所有比较来解决它。但为什么垃圾收集器会错过收集它呢?
运行它,看着它吃掉你的记忆:
import numpy as np
r = np.random.rand(2)
l = []
while True:
r == l
在64位Ubuntu 10.04上运行,virtualenv 1.7.2,Python 2.7.3,Numpy 1.6.2
答案 0 :(得分:4)
以防万一有人偶然发现并想知道......
@Dugal是的,我相信这是当前numpy版本(2012年9月)中的内存泄漏,当一些异常被引发时会发生(参见this和this)。为什么添加@BiRico“修复”的gc
调用对我来说似乎很奇怪,虽然它必须在显然之后立即完成?也许它是如何python垃圾收集回溯的奇怪,如果有人知道异常处理和垃圾收集CPython内部,我会感兴趣。
解决方法:这与列表没有直接关系,但是例如大多数广播异常(空列表不适合数组大小,空数组导致相同的泄漏。请注意内部有一个从未表面的异常准备)。所以作为一种解决方法,你应该首先检查一下形状是否正确(如果你做了很多,否则我真的不担心,如果我做对了,这只会泄漏一个小字符串。)
已修复:此问题将通过numpy 1.7解决。
答案 1 :(得分:0)
抱歉,我无法给出更完整的答案,但这似乎与垃圾收集有关。我能够在Redhat 5.8上使用python 2.7.2,numpy 1.6.1重新创建这个问题。但是,当我尝试以下操作时,内存使用率恢复正常。
import gc
import numpy as np
r = np.random.rand(2)
l = []
while True:
r == l
gc.collect()