我最近一直在处理大型矩阵。我的输入以 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)
谢谢!
我的猜测是,mmap_mode="r+"
当有问题的文件是一个压缩的 numpy 文件时,它会被忽略。我没有以这种方式使用 numpy,所以下面的一些内容是我最好的猜测。负载状态的文档
如果文件是 .npz 文件,则返回一个类似字典的对象,其中包含 {filename: array} 键值对,存档中的每个文件一个。
没有提到它对mmap_mode
. 但是在加载文件的代码中.npz
没有使用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 使用所有内存,因为没有发生内存映射。这是实现的限制load
;由于npz
格式是未压缩的 zip 存档,因此应该可以对变量进行内存映射(当然,除非您的文件是使用savez_compressed
.
实现 memmaps 的加载函数npz
将是相当多的工作,因此您可能需要查看结构化数组。它们提供类似的用法(通过键访问字段)并且已经与 memmapping 兼容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句