我有一个案例,我想使用mmap模式打开一个压缩的numpy文件,但似乎无法找到有关它如何在幕后工作的任何文档。例如,它会解压缩内存中的存档然后mmap吗?它会动态解压缩吗?
该配置缺少文档。
答案 0 :(得分:9)
基于查看代码的简短回答是,归档和压缩(无论使用np.savez
还是gzip
)与访问mmap_mode
中的文件都不兼容。这不仅仅是它是如何完成的,而是它是否可以完成。
np.load
函数中的相关位
elif isinstance(file, gzip.GzipFile):
fid = seek_gzip_factory(file)
...
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)
...
if mmap_mode:
return format.open_memmap(file, mode=mmap_mode)
看看np.lib.npyio.NpzFile
。 npz
文件是.npy
个文件的ZIP存档。它加载一个字典(如)对象,只在你访问时加载各个变量(数组)(例如obj[key]). There's no provision in its code for opening those individual files in
mmap_mode`。
很明显,使用np.savez
创建的文件无法作为mmap访问。 ZIP存档和压缩与先前在np.load
中解决的gzip压缩不同。
但使用np.save
然后gzipped
保存的单个数组是什么?请注意,使用format.open_memmap
调用file
,而不是fid
(可能是gzip文件)。
open_memmap
中np.lib.npyio.format
的更多详细信息。它的第一个测试是file
必须是一个字符串,而不是现有的文件fid。它最终将工作委托给np.memmap
。我没有看到gzip
的该功能中有任何规定。