为什么numpy数组与列表的比较消耗了如此多的内存?

时间:2012-09-17 14:26:07

标签: python arrays list memory-management numpy

最近这一点刺痛了我。我通过删除代码中列表的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

2 个答案:

答案 0 :(得分:4)

以防万一有人偶然发现并想知道......

@Dugal是的,我相信这是当前numpy版本(2012年9月)中的内存泄漏,当一些异常被引发时会发生(参见thisthis)。为什么添加@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()