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

Python 部分读取大numpy文件的有效方法?,python,numpy,Python,Numpy,我有一个巨大的numpy 3D张量,它存储在我磁盘上的一个文件中(我通常使用np.load读取)。这是一个二进制.npy文件。在使用np.load时,我很快就用完了大部分内存 幸运的是,在程序的每次运行中,我只需要大张量的某一部分。切片具有固定大小,其尺寸由外部模块提供 最好的方法是什么?我能弄明白的唯一方法就是以某种方式将这个numpy矩阵存储到MySQL数据库中。但我确信有很多更好/更简单的方法。如果有帮助的话,我也很乐意以不同的方式构建我的3D tensor文件 如果我的张量本质上是稀疏

我有一个巨大的numpy 3D张量,它存储在我磁盘上的一个文件中(我通常使用
np.load
读取)。这是一个二进制
.npy
文件。在使用
np.load
时,我很快就用完了大部分内存

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

最好的方法是什么?我能弄明白的唯一方法就是以某种方式将这个
numpy
矩阵存储到MySQL数据库中。但我确信有很多更好/更简单的方法。如果有帮助的话,我也很乐意以不同的方式构建我的3D tensor文件


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

请正常使用,但一定要指定
mmap\u mode
关键字,以便将数组保存在磁盘上,在访问时只将必要的位加载到内存中

mmap_模式:{None,'r+','r','w+','c'},如果不是无,则为可选 内存映射文件,使用给定模式(有关详细信息,请参阅numpy.memmap) 模式的详细说明)。内存映射数组保持打开状态 磁盘。但是,它可以像任何ndarray一样进行访问和切片。记忆 映射对于访问大型数据库的小片段特别有用 没有将整个文件读入内存的文件

模式描述如下:

模式:{'r+'、'r'、'w+'、'c'},可选,在此模式下打开文件 模式:“r”打开现有文件以只读r+'打开现有文件 用于阅读和写作。”w+'为创建或覆盖现有文件 读和写。”c'写时复制:赋值会影响中的数据 内存,但更改不会保存到磁盘。磁盘上的文件是 只读


*请确保不要使用“w+”模式,因为它会删除文件内容。

文件类型会有帮助。它是一个二进制文件,
.npy
。使用好的问题保存。我不知道这方面有什么工具(但很可能有)。切片是否始终沿同一轴?一个开始的地方。张量的维度/数据类型是什么?太棒了!我甚至不知道。这是一个关于
numpy
的令人印象深刻的注释,前提是SSD在今天非常流行不不幸的是,如果您需要读取整个文件,而不是一次加载所有文件,那么mmap没有多大帮助。例如,如果您创建一个生成数据块的生成器,希望您的程序所消耗的内存永远不会超过数据块的成本。使用mmap时,所使用的内存会随着您请求加载越来越多的块而不断增长,而不会“释放”您可以使用的较旧的块。@ely true,但是使用生成器对numpy来说有点不合适,因为首选方法是利用矢量化而不是迭代。在这种情况下,我可能会使用
struct
将数据打包到一个二进制文件中,并使用
numba
jit编译一个快速函数来读取和分析数据。@ely如果在刷新到磁盘之前,您可以使用
mmap
为内存中保存的内容指定一个缓存大小,那就太好了。(有人想写一个pull请求吗??)例如,当预处理非常大的数据集作为训练神经网络的输入时。您可能无法一次将整个内容加载到内存中,但您必须在某个时间点通过内存传递内容的每一部分,并且您可能需要以矢量化的方式执行线性代数、数据清理等,即使对于可以放入内存的数据的子部分也是如此。