为什么这个numpy数组太大而无法加载?

时间:2015-02-02 10:59:28

标签: python numpy file-io

我有一个3.374Gb的npz文件,myfile.npz

我可以阅读并查看文件名:

a = np.load('myfile.npz')
a.files

给出

['arr_1','arr_0']

我可以读'arr_1'确定

a1=a['arr_1']

但是,我无法加载arr_0或读取其形状:

a1=a['arr_0']
a['arr_0'].shape

以上两个操作都会出现以下错误:

ValueError: array is too big

我有16Gb RAM,其中8.370Gb可用。所以问题似乎与记忆无关。我的问题是:

  1. 我应该能够阅读此文件吗?

  2. 有人能解释这个错误吗?

  3. 我一直在考虑使用np.memmap来解决这个问题 - 这是一种合理的方法吗?

  4. 我应该使用哪种调试方法?

  5. 修改

    我可以访问具有更多RAM(48GB)的计算机并加载它。 dtype实际上是complex128a['arr_0']的未压缩内存是5750784000字节。似乎可能需要RAM开销。无论是那个或我预测的可用内存量是错误的(我使用的是windows sysinternals RAMmap)。

1 个答案:

答案 0 :(得分:2)

尺寸为np.complex128的{​​{1}}数组应该占用大约5.35GiB未压缩,所以如果你确实拥有8.3GB的免费可寻址内存,那么原则上你应该能够加载阵列。

但是,根据您在下面评论中的回答,您使用的是32位版本的Python和numpy。在Windows中,a 32 bit process can only address up to 2GB of memory(如果二进制文件使用(200, 1440, 3, 13, 32)标志编译,则为4GB;大多数32位Python分发都不是)。因此,无论您拥有多少物理内存,您的Python进程都限制为2GB的地址空间。

您可以安装64位版本的Python,numpy以及您需要的任何其他Python库,或者使用2GB限制并尝试解决它。在后一种情况下,你可能会主要在磁盘上存储超过2GB限制的数组(例如使用IMAGE_FILE_LARGE_ADDRESS_AWARE),但我建议你选择#1选项,因为对memmaped数组的操作是在大多数情况下比完全驻留在RAM中的普通np.memmap要慢得多。


如果你已经有另一台机器有足够的RAM来将整个阵列加载到核心内存中,那么我建议你以不同的格式保存数组(或者作为普通的np.memmap二进制文件,或者更好,在使用PyTablesH5py的HDF5文件。从np.array文件中提取问题数组而不将其加载到RAM中也是可能的(尽管有点棘手),以便您可以将其作为驻留在磁盘上的.npz数组打开:

np.memmap