mmap和gzip能协同工作吗?

13 投票
2 回答
5291 浏览
提问于 2025-04-16 12:35

我正在尝试弄清楚如何在使用gzip压缩文件时使用mmap。这可能吗?

import mmap
import os
import gzip

filename = r'C:\temp\data.gz'

file = gzip.open(filename, "rb+")
size = os.path.getsize(filename)

file = mmap.mmap(file.fileno(), size)

print file.read(8)

输出的数据是压缩过的。

2 个回答

17

嗯,不是你想的那样。

如果你想访问压缩过的文件,可以使用mmap(),前提是你需要的是压缩的数据。

mmap() 是一种系统调用,它可以把硬盘上的数据块映射到内存中,感觉就像是在添加交换空间一样。

你不能用mmap()把未压缩的数据映射到内存中,因为这些数据并不在硬盘上。

18

你可以很简单地做到这一点。实际上,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()

撰写回答