我最近一直在处理大型矩阵。我的输入以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)
谢谢!
答案 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。它们提供类似的用法(通过键访问字段),并且已经与映射兼容。