python – 在循环中使用numpy加载时内存溢出
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 在循环中使用numpy加载时内存溢出,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2308字,纯文字阅读大概需要4分钟。
内容图文
![python – 在循环中使用numpy加载时内存溢出](/upload/InfoBanner/zyjiaocheng/965/df71ec18946c480da75c824a2d83ce27.jpg)
循环npz文件加载会导致内存溢出(取决于文件
列表长度).
以下所有内容似乎都没有帮助
>删除存储文件中数据的变量.
>使用mmap.
>调用gc.collect()(垃圾回收).
以下代码应该重现这种现象:
import numpy as np
# generate a file for the demo
X = np.random.randn(1000,1000)
np.savez('tmp.npz',X=X)
# here come the overflow:
for i in xrange(1000000):
data = np.load('tmp.npz')
data.close() # avoid the "too many files are open" error
在我的实际应用程序中,循环遍历文件列表,溢出超过24GB的RAM!
请注意,这是在ubuntu 11.10和numpy v上尝试过的
1.5.1以及1.6.0
我已经在numpy ticket 2048提交了一份报告,但这可能是一个更广泛的兴趣所以我也在这里发布它(此外,我不确定这是一个错误,但可能导致我编程错误).
解决方案(由HYRY提供):
命令
del data.f
应该在命令之前
data.close()
有关更多信息和查找解决方案的方法,请阅读下面的HYRY的答案
解决方法:
我认为这是一个错误,也许我找到了解决方案:调用“del data.f”.
for i in xrange(10000000):
data = np.load('tmp.npz')
del data.f
data.close() # avoid the "too many files are open" error
发现这种内存泄漏.您可以使用以下代码:
import numpy as np
import gc
# here come the overflow:
for i in xrange(10000):
data = np.load('tmp.npz')
data.close() # avoid the "too many files are open" error
d = dict()
for o in gc.get_objects():
name = type(o).__name__
if name not in d:
d[name] = 1
else:
d[name] += 1
items = d.items()
items.sort(key=lambda x:x[1])
for key, value in items:
print key, value
在测试程序之后,我在gc.get_objects()中创建了一个dict和count对象.这是输出:
...
wrapper_descriptor 1382
function 2330
tuple 9117
BagObj 10000
NpzFile 10000
list 20288
dict 21001
从结果我们知道BagObj和NpzFile有问题.找到代码:
class NpzFile(object):
def __init__(self, fid, own_fid=False):
...
self.zip = _zip
self.f = BagObj(self)
if own_fid:
self.fid = fid
else:
self.fid = None
def close(self):
"""
Close the file.
"""
if self.zip is not None:
self.zip.close()
self.zip = None
if self.fid is not None:
self.fid.close()
self.fid = None
def __del__(self):
self.close()
class BagObj(object):
def __init__(self, obj):
self._obj = obj
def __getattribute__(self, key):
try:
return object.__getattribute__(self, '_obj')[key]
except KeyError:
raise AttributeError, key
NpzFile有del(),NpzFile.f是BagObj,而BagObj._obj是NpzFile,这是一个引用循环,会导致NpzFile和BagObj无法收集.以下是Python文档中的一些解释:http://docs.python.org/library/gc.html#gc.garbage
因此,要打破参考周期,需要调用“del data.f”
内容总结
以上是互联网集市为您收集整理的python – 在循环中使用numpy加载时内存溢出全部内容,希望文章能够帮你解决python – 在循环中使用numpy加载时内存溢出所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。