加载对于 RAM 来说太大的 .npy 文件

Posted

技术标签:

【中文标题】加载对于 RAM 来说太大的 .npy 文件【英文标题】:Loading .npy file that are too large for RAM 【发布时间】:2021-08-12 17:32:38 【问题描述】:

我正在尝试将一个大的 .npy 文件 (~800 MB) 加载到 Google Collab 中,但每次我尝试这样做时,Collab 实例都会由于 RAM 过度使用而崩溃。

     import numpy as np
     a=np.load('oddata.npy',allow_pickle=True)

我正在使用具有 12 GB RAM 的基本 Collab 实例。

我曾尝试使用 mmap,但它返回此错误:ValueError: Array can't be memory-mapped: Python objects in dtype.

问题是否存在,例如将 .npy 文件分成块或将其转换为另一种文件格式。

最好的,

阿拉夫

【问题讨论】:

HDF5 支持分块读取文件。您可以尝试将文件转换为 HDF5,但您至少需要能够在进行转换的机器上打开它。例如,您可以在交换内存非常大的机器上执行此操作。但是请注意,HDF5 不会接受纯 Python 对象,我认为这是您的主要问题。为什么不使用原生类型? 非常感谢您的快速响应。问题是这是一个预制数据集,所以我真的没有机会创建任何原生类型。 【参考方案1】:

我认为您的问题不仅仅是内存不足。 Collab 实例中分配的 12 GB 应该足以读取 800MB 的文件。为了确认,我在我的 Raspberry Pi(只有 4GB RAM)上运行了一个简单的测试。它可以创建一个 1GB 的 .npy 文件并将其读回新数组。代码如下:

import numpy as np
nimg, n0, n1 = 1000, 512, 512
arr = np.arange(nimg*n0*n1).reshape(nimg,n0,n1)
print(arr.dtype, arr.shape)

np.save('SO_67671598.npy',arr)
arr2 = np.load('SO_67671598.npy')    
print(arr2.dtype, arr2.shape)

无论有没有allow_pickle=True 参数,我都会得到相同的结果。请注意,不推荐使用allow_pickle=True(出于安全原因)。在加载对象数组时是必需的。我建议你在你的 Collab 实例中运行这个测试,看看你会得到什么。

【讨论】:

先生,我尝试了您建议的测试,并且能够在我的 Collab 实例上运行它而没有任何问题。此时我怀疑我的数据文件很可能已损坏。我将尝试从文件加载脚本重新创建 .npy 文件。非常感谢您的宝贵时间!

以上是关于加载对于 RAM 来说太大的 .npy 文件的主要内容,如果未能解决你的问题,请参考以下文章

Redshift 查询输出对于 RAM 来说太大

加载 .npy 文件会加载一个空数组

如何在不先加载到 RAM 的情况下将文件加载到 blob 中?

如何从 Kaggle 将一个太大的 Kaggle 数据集的选定文件加载到 Colab 中

输入包含无穷大或对于 dtype('float64') 错误来说太大的值

ValueError:输入包含 NaN、无穷大或对于 dtype 来说太大的值