1

我有 ~1GB *.tbz 文件。在每个文件中都有一个 ~9GB 文件。我只需要读取这个文件的头,前 1024 个字节。

我希望它尽可能快地执行此操作,因为我有数百个要处理的 1GB 文件。提取大约需要 1 分 30 秒。

我尝试使用完全提取:

tar = tarfile.open(fn, mode='r|bz2')
for item in tar:
    tar.extract(item)

tarfile.getmembers()没有速度改进:

tar = tarfile.open(fn, mode='r|bz2')
for member in tar.getmembers():
    f = tar.extractfile(member)
    headerbytes = f.read(1024)
    headerdict = parseHeader(headerbytes)

getmembers()方法是一直在那里花费的时间。

我有什么办法吗?

4

2 回答 2

1

如果您确定每个 tar 存档仅包含一个 bz2 文件,您可以在第一次读取 tar 文件时跳过前 512 个字节(当然不是其中包含的 bz2 文件),因为 tar 文件格式有填充的(固定大小)标题,之后存储您的“真实”内容。

一个简单的

f.seek(512)

而不是遍历 getmembers() 应该可以解决问题。

于 2015-11-23T16:07:39.297 回答
1

我认为您应该使用标准库bz2接口。是使用指定格式选项压缩.tbz的文件的文件扩展名。tar-jbzip2

正如@bbayles在评论中指出的那样,您可以将文件打开为 abz2.BZ2File并使用seekand read

读取([大小])

最多读取 size 个未压缩字节,以字符串形式返回。如果 size 参数为负数或省略,则读取直到到达 EOF。

寻找(偏移量[,从哪里来])

移动到新的文件位置。参数偏移量是字节数。

f = bz2.BZ2File(path)
f.seek(512) 
headerbytes = f.read(1024)

然后,您可以使用您的函数对其进行解析。

headerdict = parseHeader(headerbytes)
于 2015-11-23T16:34:16.583 回答