numpy如何处理mmap';什么是npz文件?
我有一个案例,我想使用mmap模式打开一个压缩的numpy文件,但似乎找不到任何关于它如何在封面下工作的文档。例如,它会解压缩内存中的归档文件,然后对其进行mmap吗?它会在飞行中减压吗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
该配置没有文档。基于查看代码,简短的回答是存档和压缩,无论是使用
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
vianp.lib.npyio
正在做特殊的数组工作,即使在那里,当事情变得困难时(例如保存数据类型对象),它也会“下注”到pickle
。我不确定是否理解你的评论。似乎打开数组会在内存中解压(这可能是动态解压),因此我猜可以从中创建numpy.memap
对象(bytes
变量)。深入np.lib.npyio
模块,附带zipfile
和mmap
。演示如何使用io.BytesIO
创建savez
和load
,即制作内存中的压缩文件。