我有一个巨大的 numpy 3D 张量,它存储在我磁盘上的一个文件中(我通常使用
np.load
读取该文件)。这是一个二进制 .npy
文件。在使用 np.load
时,我很快就用完了大部分记忆。
幸运的是,在程序的每次运行中,我只需要大张量的某一部分。切片具有固定大小,其尺寸由外部模块提供。
最好的方法是什么?我能想到的唯一方法是以某种方式将这个
numpy
矩阵存储到 MySQL 数据库中。但我确信有很多更好/更简单的方法。如果有帮助的话,我也很乐意以不同的方式构建我的 3D 张量文件。
如果我的张量本质上是稀疏的,答案会改变吗?
numpy.load
,但请务必指定 mmap_mode
关键字,以便数组保留在磁盘上,并且在访问时仅将必要的位加载到内存中。
mmap_mode : {None, ‘r+’, ‘r’, ‘w+’, ‘c’}, 可选 如果不是 None,则 使用给定的模式对文件进行内存映射(请参阅 numpy.memmap 了解 模式的详细描述)。内存映射数组保持打开状态 磁盘。然而,它可以像任何 ndarray 一样被访问和切片。记忆 映射对于访问大片段的小片段特别有用 文件而不将整个文件读入内存。
numpy.memmap
: 中进行了描述
mode : {‘r+’, ‘r’, ‘w+’, ‘c’}, 可选 文件在此打开 模式:‘r’ 打开现有文件以只读方式。 ‘r+’ 打开现有文件 用于阅读和写作。 ‘w+’ 创建或覆盖现有文件 读写。 ‘c’ 写时复制:赋值影响数据 内存,但更改不会保存到磁盘。磁盘上的文件是 只读。
*请务必不要使用“w+”模式,因为它会删除文件的内容。