numpy内存映射问题

时间:2018-10-08 13:42:26

标签: python numpy

我最近一直在处理大型矩阵。我的输入以15GB .npz文件的形式存储,我正尝试逐步读取这些文件。

我熟悉内存映射,并且看到numpy也支持这些操作似乎是一个完美的解决方案。但是,我面临的问题如下:

我首先用以下方法加载矩阵:

foo = np.load('matrix.npz',mmap_mode="r+")

foo有一个密钥:data

例如,当我尝试这样做时:

foo['data'][1][1]

numpy似乎无休止地花费可用的RAM,几乎就像没有内存映射一样。我做错什么了吗?

例如,我的目标是一次读取30行:

for x in np.arange(0,matrix.shape[1],30):
    batch = matrix[x:(x+30),:]
    do_something_with(batch)

谢谢!

1 个答案:

答案 0 :(得分:0)

我的猜测是,当相关文件是压缩的numpy文件时,mmap_mode="r+"将被忽略。我没有以这种方式使用numpy,因此以下是我的最佳猜测。 load国的文档

  

如果文件是.npz文件,则将返回一个类似于字典的对象,其中包含{filename:array}键值对,对于归档中的每个文件一个。

未提及mmap_mode的用途。但是,在用于加载.npz文件的code中,没有使用mmap_mode关键字:

    if magic.startswith(_ZIP_PREFIX):
        # zip-file (assume .npz)
        # Transfer file ownership to NpzFile
        tmp = own_fid
        own_fid = False
        return NpzFile(fid, own_fid=tmp, allow_pickle=allow_pickle, pickle_kwargs=pickle_kwargs)

因此,您最初的猜测确实是正确的。 Numpy使用了所有的ram,因为没有发生映射。这是对load的实现的限制;由于npz格式是未压缩的zip存档,因此应该可以对变量进行内存映射(当然,除非您的文件是使用savez_compressed创建的)。

实现内存映射npz的加载功能虽然需要很多工作,所以您可能要看一下structured arrays。它们提供类似的用法(通过键访问字段),并且已经与映射兼容。