【问题标题】:Error saving and loading a list of matrices保存和加载矩阵列表时出错
【发布时间】:2015-10-17 15:59:14
【问题描述】:

我有一个列表“data_list”,我会保存它以便在另一个脚本中加载它。 首先我把它转换成一个数组,这样:

data_array = np.array(data_list)

然后我保存了它:

np.savez("File", data_array)

然后,在另一个脚本中,我想访问“文件”;所以:

a = np.load("File.npz") 
b = a['arr_0']

我直到两周前才使用此代码,它运行良好。这些天来,我正在尝试使用我的程序,但它以该行中标识的错误结束

b = a['arr_0']

“文件”是一个 300 MB 的文件。最奇怪的是,它突然停止工作了。 知道会发生什么吗?

Ps:我给你一些信息。我的列表包含 180 个 511x511 的矩阵。每个矩阵都包含十进制数(我尝试创建 180 个零矩阵,错误以同样的方式发生)。如果我减少矩阵的数量,脚本可以正常工作:特别是 130 个矩阵是可以的,而最多的程序不起作用。 这里我报错信息

        b = a['arr_0']
    File "C:\Python27\lib\site-packages\numpy\lib\npyio.py", line 241, in     
    __getitem__
        return format.read_array(value)
    File "C:\Python27\lib\site-packages\numpy\lib\format.py", line 459, in   
    read_array
        array = numpy.fromstring(data, dtype=dtype, count=count)
    MemoryError 

【问题讨论】:

    标签: python numpy matrix


    【解决方案1】:

    MemoryError 是内存不足的情况。这就解释了为什么它发生在至少一定大小的对象上——如您所料,越来越大的数组需要更多的内存。最大尺寸是多少,为什么它似乎已经改变,更难。这可能与您的系统高度相关,尤其是考虑到以下因素:

    • 有多少内存(物理 RAM 和交换空间)可供操作系统使用
    • 操作系统为 Python 提供了多少虚拟内存
    • 您已经使用了多少
    • C 库的实现,尤其是它的 malloc 函数,它会影响 Python 使用分配的内存的方式

    可能还有很多其他的东西。

    根据 cmets,这里最大的问题似乎是您运行的是 32 位版本的 Python。在 Windows 上,32 位进程 apparently have an effective maximum memory address space of around 2GB。根据我的测试,您正在使用的数组列表本身可能需要大约四分之一。您的错误仅在重新读取文件时出现这一事实表明 numpy 反序列化相对占用大量内存,但我对其实现了解不足,无法说出为什么会这样。无论如何,安装 64 位 Python 版本似乎是您最好的选择。

    【讨论】:

    • 感谢您的回答。我不明白的是,如果我使用由许多矩阵组成的列表(在脚本中),为什么我不能使用相同的数据在另一个脚本中加载它?如果这是一个真正的内存错误,我无法创建列表。但我可以。
    • 如果独立创建它仍然有效,但读取它(在同一台计算机上的同一个 Python 解释器上使用不同的脚本)没有,这可能与第二个脚本还有什么有关做,甚至是一些关于 numpy 如何反序列化数组的工件。成功创建惊人的海量数组列表后检查系统的内存使用情况 - 它可能会占系统内存的相当一部分。
    • 绝对不是。内存在加载我的列表之前和之后都使用 2.5 GB/7.9 GB。在加载命令和访问之间插入 raw_input() 不会改变内存使用。
    • This mailing list post 详细说明了在 32 位上下文中每个进程的内存限制如何在 Windows 上工作(您几乎可以肯定在 64 位操作系统上拥有 8GB 可用 RAM,但您仍然可以运行32 位 Python 出于某种原因)。它表明每个进程的可用空间限制约为 2GB。在程序中插入输入不会有太大变化,特别是如果您不保留结果字符串。看看你是否可以通过创建一些 big 来复制错误,比如一个超大的 np 数组。
    • 尽管快速测试表明 180 511 * 511 数组应该少于 400MB,即使考虑到将它们放在列表中的开销也是如此。所以我最好的猜测是 numpy 的反序列化例程需要相当多的“额外”内存作为工作空间。
    猜你喜欢
    • 2016-01-24
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 2015-10-18
    • 2021-04-07
    • 1970-01-01
    相关资源
    最近更新 更多