繁体   English   中英

为什么将numpy数组与列表进行比较会消耗大量内存?

[英]Why does comparison of a numpy array with a list consume so much memory?

最近这有点刺痛我。 我通过从代码中删除所有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上运行

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

@Dugal是的,我相信这是当前numpy版本(2012年9月)中的内存泄漏,当引发某些异常时会发生此泄漏(请参阅thisthis )。 为什么添加@BiRico可以“修复”的gc调用对我来说似乎很奇怪,尽管它必须在出现后立即完成? 也许它与python垃圾收集回溯的方式很奇怪,如果有人知道异常处理和垃圾收集CPython Internals,我将很感兴趣。

解决方法 :这与列表没有直接关系,但是例如大多数广播异常(空列表不适合数组大小,空数组会导致相同的泄漏。请注意,内部准备了一个永不浮出水面的异常)。 因此,作为一种解决方法,您可能应该首先检查形状是否正确(如果您做了很多,否则我不会担心,如果我正确的话,这只会泄漏一小串)。

已修复: numpy 1.7将解决此问题。

抱歉,我无法给出更完整的答案,但这似乎与垃圾回收有关。 我能够在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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM