【问题标题】:How does numpy handle mmap's over npz files?numpy 如何处理 mmap 的 npz 文件?
【发布时间】:2015-05-18 18:54:03
【问题描述】:

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

没有该配置的文档。

【问题讨论】:

  • 你说的是用np.savez创建的文件吗?还是用np.save 创建然后压缩的? npz 文件用np.lib.npyio.NpzFile 加载。看看它的代码。
  • @hpaulj 是正确的,虽然it is possible 将压缩数组从.npz 存档提取到磁盘,然后以memmap 模式打开解压缩数组。对于动态压缩和解压缩,您应该真正关注 HDF5(PyTablesh5py)。

标签: numpy gzip mmap


【解决方案1】:

根据查看代码,简短的回答是归档和压缩,无论是使用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 inmmap_mode`。

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

但是用np.savegzipped 保存的单个数组呢?请注意,format.open_memmap 是用 file 调用的,而不是 fid(可能是 gzip 文件)。

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

【讨论】:

  • 我最近通过查看代码得出了相同的结论。我想知道是否很难添加此功能。鉴于numpy 的开发人员非常出色,他们甚至没有尝试过会令人惊讶。您对此有何看法?
  • 在另一个最近的npz 问题中指出,您可以采取另一个方向 - 在内存中创建压缩存档(使用 StringIO)。在所有这些情况下,numpy 开发人员没有完成特殊的C 工作——他们使用现有的python 模块(mmapzip 等)。 np.save via np.lib.npyio 正在做专门的数组工作,即使在遇到困难时(例如保存 dtype 对象),它也会“踢”到 pickle
  • 不确定我是否理解您的评论。似乎打开数组在内存中解压它(它可能是即时解压)所以我想可以从中创建一个numpy.memap 对象(bytes 变量)。
  • 深入了解np.lib.npyio 模块,同时访问zipfilemmap
  • stackoverflow.com/a/25837662/901925 演示了使用io.BytesIO 创建savezload,即在内存中创建压缩文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-24
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-10
  • 2010-12-12
相关资源
最近更新 更多