numpy如何处理mmap对npz文件的影响?

时间:2015-03-16 15:22:05

标签: numpy gzip mmap

我有一个案例,我想使用mmap模式打开一个压缩的numpy文件,但似乎无法找到有关它如何在幕后工作的任何文档。例如,它会解压缩内存中的存档然后mmap吗?它会动态解压缩吗?

该配置缺少文档。

1 个答案:

答案 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.NpzFilenpz文件是.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_memmapnp.lib.npyio.format的更多详细信息。它的第一个测试是file必须是一个字符串,而不是现有的文件fid。它最终将工作委托给np.memmap。我没有看到gzip的该功能中有任何规定。