【问题标题】:Can mmap and gzip collaborate?mmap 和 gzip 可以合作吗?
【发布时间】:2011-07-04 22:00:05
【问题描述】:

我试图弄清楚如何将 mmap 与 gzip 压缩文件一起使用。这有可能吗?

导入地图 导入操作系统 导入 gzip 文件名 = r'C:\temp\data.gz' 文件 = gzip.open(文件名,“rb+”) 大小 = os.path.getsize(文件名) 文件 = mmap.mmap(file.fileno(), 大小) 打印文件.read(8)

输出数据被压缩。

【问题讨论】:

  • 似乎不是 C++ 或 C#,因为行尾缺少 ;。也许是 Python 或 Ruby?
  • @uwe,那个导入语法和那些库函数是python
  • 谢谢@tobyodavies,我已经添加了标签。
  • 您在寻找 zlib 吗? zlib 与 gzip 的算法相同,但您可能需要调整一些设置才能使其工作完全相同。

标签: python gzip mmap


【解决方案1】:

嗯,不是你想要的方式。

mmap() 可以用来访问压缩后的文件,如果压缩数据是你想要的。

mmap() 是一个系统调用,用于将磁盘块映射到 RAM,就像添加交换一样。

您无法使用 mmap() 将未压缩的数据映射到 RAM,因为它不在磁盘上。

【讨论】:

    【解决方案2】:

    您可以轻松完成。事实上,gzip 模块将一个类似文件的对象作为可选参数。

    import mmap
    import gzip
    
    filename = "a.gz"
    handle = open(filename, "rb")
    mapped = mmap.mmap(handle.fileno(), 0, access=mmap.ACCESS_READ)
    gzfile = gzip.GzipFile(mode="r", fileobj=mapped)
    
    print gzfile.read()
    

    这同样适用于 tarfile 模块:

    import sys
    import mmap
    import tarfile
    
    f = open(sys.argv[1], 'rb')
    fo = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
    tf = tarfile.open(mode='r:gz', fileobj=fo)
    
    print tf.getnames()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多