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