我有一个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可用。所以问题似乎与记忆无关。我的问题是:
我应该能够阅读此文件吗?
有人能解释这个错误吗?
我一直在考虑使用np.memmap
来解决这个问题 - 这是一种合理的方法吗?
我应该使用哪种调试方法?
修改
我可以访问具有更多RAM(48GB)的计算机并加载它。 dtype
实际上是complex128
,a['arr_0']
的未压缩内存是5750784000字节。似乎可能需要RAM开销。无论是那个或我预测的可用内存量是错误的(我使用的是windows sysinternals RAMmap)。
答案 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
二进制文件,或者更好,在使用PyTables或H5py的HDF5文件。从np.array
文件中提取问题数组而不将其加载到RAM中也是可能的(尽管有点棘手),以便您可以将其作为驻留在磁盘上的.npz
数组打开:
np.memmap