numpy如何处理mmap';什么是npz文件?

numpy如何处理mmap';什么是npz文件?,numpy,gzip,mmap,Numpy,Gzip,Mmap,我有一个案例,我想使用mmap模式打开一个压缩的numpy文件,但似乎找不到任何关于它如何在封面下工作的文档。例如,它会解压缩内存中的归档文件,然后对其进行mmap吗?它会在飞行中减压吗 该配置没有文档。基于查看代码,简短的回答是存档和压缩,无论是使用np.savez还是gzip,都与在mmap_模式下访问文件不兼容。这不仅仅是如何做到的问题,而是能否做到的问题 np.load函数中的相关位 elif isinstance(file, gzip.GzipFile): fid = seek

我有一个案例,我想使用mmap模式打开一个压缩的numpy文件,但似乎找不到任何关于它如何在封面下工作的文档。例如,它会解压缩内存中的归档文件,然后对其进行mmap吗?它会在飞行中减压吗


该配置没有文档。

基于查看代码,简短的回答是存档和压缩,无论是使用
np.savez
还是
gzip
,都与在
mmap_模式下访问文件不兼容。这不仅仅是如何做到的问题,而是能否做到的问题

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存档。它加载一个dictionary(like)对象,并且仅在您访问单个变量(数组)时加载它们(例如,
obj[key])。其代码中没有规定以
mmap_模式”打开这些单独的文件

很明显,使用
np.savez
创建的文件不能作为mmap访问。ZIP存档和压缩与前面在
np.load
中提到的gzip压缩不同

但是,如果使用
np.save
保存单个数组,然后使用
gzip
,该怎么办呢?请注意,
format.open\u memmap
是通过
文件
调用的,而不是
fid
(可能是gzip文件)


有关
np.lib.npyio.format
中的
open\u memmap
的更多详细信息。它的第一个测试是
文件
必须是字符串,而不是现有的文件fid。它最终将工作委托给
np.memmap
。我看不到该函数中有任何关于
gzip

的规定。您是说用
np.savez
创建的文件吗?还是用
np.save
创建然后压缩
npz
文件是用
np.lib.npyio.NpzFile
加载的。看看它的代码。@hpaulj是正确的,不过要从
.npz
存档文件中提取压缩数组到磁盘,然后在memmap模式下打开解压缩的数组。对于动态压缩和解压缩,您应该真正了解HDF5(或)。我最近通过查看代码得出了相同的结论。我想知道是否很难添加此功能。考虑到
numpy
开发人员非常出色,他们甚至没有尝试,这将是令人惊讶的。您对此有何看法?最近的另一个
npz
问题指出,您可以走另一个方向——在内存中创建压缩存档(使用StringIO)。在所有这些情况下,
numpy
开发人员没有做特殊的
C
工作-他们使用现有的
python
模块(
mmap
zip
,等等)
np.save
via
np.lib.npyio
正在做特殊的数组工作,即使在那里,当事情变得困难时(例如保存数据类型对象),它也会“下注”到
pickle
。我不确定是否理解你的评论。似乎打开数组会在内存中解压(这可能是动态解压),因此我猜可以从中创建
numpy.memap
对象(
bytes
变量)。深入
np.lib.npyio
模块,附带
zipfile
mmap
。演示如何使用
io.BytesIO
创建
savez
load
,即制作内存中的压缩文件。