在循环中使用 numpy load 时内存溢出

2024-01-30

循环加载 npz 文件会导致内存溢出(取决于文件 列表长度)。

以下似乎都没有帮助

  1. 删除文件中存储数据的变量。

  2. 使用 mmap。

  3. 调用 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 票 2048 http://projects.scipy.org/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() 中计数对象。这是输出:

...
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 http://docs.python.org/library/gc.html#gc.garbage

因此,要打破引用循环,需要调用“del data.f”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在循环中使用 numpy load 时内存溢出 的相关文章

随机推荐

  • publicId 和 systemId 之间需要空格

    我试图通过在 jsp 中编写一些代理代码来从我的计算机本地对其他域进行 ajax 调用 这是我调用 proxy jsp 页面的 jQuery AJAX 代码 var metadata https rest search host com m
  • 是否可以从 clickhouse 表中删除旧记录?

    据我所知 clickhouse只允许插入新数据 但是是否可以删除早于某个时间段的块以避免硬盘溢出 轻量级删除 自 v22 8 起可用 MergeTree 表的标准 DELETE 语法已在 37893 https github com Cli
  • 不存在的列不应破坏 select 中的 sql 查询

    就我而言 有不同的数据库版本 SQL Server 例如我的桌子orders有专栏htmltext在版本 A 中 但在版本 B 中列htmltext不见了 Select order id order date htmltext from o
  • 在迭代器中访问 C# 基类会导致 ReSharper 警告

    我有两节课GenericList and SpecificList where SpecificList继承自GenericList GenericList实施IEnumerable
  • WCF双工服务通道关闭

    我有一个基于 WCF Duplex 服务的应用程序 当用户 重新启动 应用程序所做的工作时 我遇到问题 在后台 客户端关闭与 WCF 服务的连接并创建另一个连接 服务合同的定义如下 ServiceContract Namespace net
  • Spark/Scala 中将 RDD 转换为 Dataframe

    RDD 已按以下格式创建Array Array String 并具有以下值 val rdd Array Array String Array Array 4580056797 0 2015 07 29 10 38 42 0 1 1 Arra
  • Python 3.4:cStringIO 与 StringIO

    QUESTION 我返回一个 ImportError 没有名为 cStringIO 的模块 不幸的是 cStringIO 不再存在 我需要使用 StringIO 作为替代品 我怎样才能做到这一点 import edgar import ft
  • 在 Jinja 模板中使用 Ansible 控制主机的 IP 地址

    我想将 IP 地址插入到 Ansible playbook 使用的 J2 模板中 该IP地址是not正在配置的主机的地址 以及完成配置的主机的 IP 到目前为止我发现的所有内容都涵盖了使用与所配置的主机相关的变量 事实 换句话说 我要插入的
  • .NET 4.0 与 3.5 运行时性能

    现在 VS2010 已处于 RC 状态 距离 2 0 以来第一个新 核心 运行时版本的发布似乎只剩下几周的时间了 虽然我没有立即升级的需求 但我想知道是否有人在两者之间进行了一些性能测试 基准测试 如果有任何明显的性能提升 那么重新编译现有
  • “FirebaseAnalytics.Param.SIGN_UP_METHOD”无法在控制台中保存“值”以及“事件名称”

    我正在使用此代码来分析用户正在使用的sign up方法 Bundle bundle new Bundle bundle putString FirebaseAnalytics Param SIGN UP METHOD sign up met
  • Visio 形状 - 获取 X、Y 位置

    我已成功使用以下代码以编程方式将形状插入到 Visio 中 ActiveWindow Page Drop VisioApp Documents ORGCH M VSS Masters ItemU Executive 5 433071 7 5
  • App Engine Java 8 标准环境中的 Servlet 异步处理支持

    我正在尝试使用 GAE J8 标准环境 无可扩展环境 的 servlet 3 1 中的异步处理支持 基本上我有一个 servlet 注释为 WebServlet name MyServletName urlPatterns dosometh
  • 如何在javafx代码中添加Anchorpane约束?

    我知道您可以在 fxml 中添加 Anchor Pane 包含 例如 AnchorPane bottomAnchor 0 0 但是您可以在 java 代码中设置 AnchorPane 约束吗 AnchorPane 上有一组静态方法 您可以使
  • C++/CLI MSIL 程序集中的指针数组

    我正在尝试包装一些遗留的 C 代码 以便与在 NET Core 上运行的 C 一起使用 我在用着这里给出的方法 https stackoverflow com a 9004833创建编译为纯 MSIL 的 C 包装器 它对于简单的函数运行良
  • 在什么情况下,finally {} 块不会执行?

    在Java中try catch finally 块 内的代码finally 通常被认为 保证 运行 无论 try catch 中发生什么 然而 我知道至少在两种情况下它会not执行 If System exit 0 叫做 或者 如果异常一直
  • WildFly 中未找到 Nashorn 类

    我需要从 WildFly 中运行的 Web 应用程序内的 nashorn 访问内部类 以下代码在我的机器上运行良好 public class NashornTest public static void main String args t
  • 休眠验证器。如何使用@Valid注解?

    目的是什么 Valid将其放在方法参数级别时的注释 public void Valid Person p 我创建了一个测试 并将无效对象传递给该方法 但没有任何反应 我希望得到一个例外 The Valid对象上的注释指示验证框架处理带注释的
  • CMUSphinx 实时语音识别太慢?

    CMU Sphinx 识别实时语音太慢 不知道你有什么办法增强它吗 这是我的配置 configuration setAcousticModelPath WSJ 8gau 13dCep 16k 40mel 130Hz 6800Hz confi
  • JavaScript RegExp 中的 (*SKIP)(*FAIL) 解决方法

    我有一个在 regex101 com 中运行良好的正则表达式模式 a SKIP FAIL bword b 我正在尝试将其设为正则表达式 以便可以在replace JavaScript 中的函数 JavaScript 代码行是 var reg
  • 在循环中使用 numpy load 时内存溢出

    循环加载 npz 文件会导致内存溢出 取决于文件 列表长度 以下似乎都没有帮助 删除文件中存储数据的变量 使用 mmap 调用 gc collect 垃圾收集 以下代码应该重现该现象 import numpy as np generate