在没有完全提取的情况下读取tarfile中的大文件头(~9GB)



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

我希望这能尽快完成,因为我有数百个1GB的文件要处理。提取大约需要1m30s。

我尝试使用完全提取:

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

和CCD_ 1,但没有速度改进:

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

getmembers()方法在那里花费了所有的时间。

我有办法做到这一点吗?

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

正如@bbayles在评论中指出的那样,您可以将文件作为bz2.BZ2File打开,并使用seektarfile.getmembers()0:

读取([size])

读取最大大小的未压缩字节,返回为一串如果size参数为负数或被忽略,则读取直到EOF为已达到。

寻找(偏移[,从何处])

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

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

然后,您可以使用函数解析它。

headerdict = parseHeader(headerbytes)

如果你确定每个tar档案都只包含一个bz2文件,那么在第一次读取tar文件时,你可以跳过前512个字节(当然不是其中包含的bz2),因为tar文件格式有一个填充的(固定大小)头,之后会存储你的"真实"内容。

一个简单的

f.seek(512)

与其在getmembers()上循环,不如这样做。

最新更新