部分读取大型 numpy 文件的有效方法?

问题描述 投票:0回答:1

我有一个巨大的 numpy 3D 张量,它存储在我磁盘上的一个文件中(我通常使用

np.load
读取该文件)。这是一个二进制
.npy
文件。在使用
np.load
时,我很快就用完了大部分记忆。

幸运的是,在程序的每次运行中,我只需要大张量的某一部分。切片具有固定大小,其尺寸由外部模块提供。

最好的方法是什么?我能想到的唯一方法是以某种方式将这个

numpy
矩阵存储到 MySQL 数据库中。但我确信有很多更好/更简单的方法。如果有帮助的话,我也很乐意以不同的方式构建我的 3D 张量文件。


如果我的张量本质上是稀疏的,答案会改变吗?

python numpy
1个回答
51
投票

照常使用

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+”模式,因为它会删除文件的内容。

© www.soinside.com 2019 - 2024. All rights reserved.