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

mar*_*ars 16 python numpy

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

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

最好的方法是什么?我能想出的唯一方法是将这个numpy矩阵存储到MySQL数据库中.但我敢肯定有很多更好/更简单的方法.我也很乐意以不同的方式构建我的3D张量文件,如果有帮助的话.


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

Aar*_*ron 24

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'Copy-on-write:赋值会影响内存中的数据,但更改不会保存到磁盘.磁盘上的文件是只读的.

*请务必不要使用'w +'模式,因为它会删除文件的内容.

  • 例如,在预处理非常大的数据集以作为训练神经网络的输入时。您可能无法一次将整个内容加载到内存中,但您必须在某个时候将内容的每一部分都通过内存,*并且*您可能需要执行线性代数、数据清理等,以矢量化的方式,即使对于可以放入内存的数据的子部分。 (4认同)
  • 不幸的是,如果您需要读取整个文件,而不是一次加载所有文件,那么 mmap 没有多大帮助。例如,如果您创建一个生成数据块的生成器,希望您的程序消耗的内存永远不会超过块的成本。使用 mmap,使用的内存会随着您请求加载越来越多的块而增长和增长,而不会“释放”您可能已完成的旧块。 (2认同)