2015-11-23 25 views
1

我〜1GB * .tbz的文件。在每个文件里面都有一个〜9GB的文件。我只需要读取这个文件的头部,前1024个字节。阅读里面tar文件大文件头(〜9GB)不足额提取

我想,因为我有数百个这样的文件1GB我要处理这个要做到这一点尽可能快。它需要大约1分30秒的时间来提取。

我试着用足额提取:

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

tarfile.getmembers()但没有速度imprevement:

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

getmembers()方法是什么把所有的时间在那里。

有什么办法,我可以这样做呢?

+0

你能展示一个你需要解析的样本头吗? –

+1

你可以使用[BZ2File](https://docs.python.org/2/library/bz2.html#bz2.BZ2File)来读出一个块吗?也许你可以完全跳过'tar'部分。 – bbayles

+0

谢谢!这工作!你想发布一个完整的答案? f = bz2.BZ2File(fn); f.seek(512); headerbytes = f.read(1024); headerdict = parseHeader(headerbytes) – roho

回答

1

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

由于@bbayles在评论中指出的那样,你可以打开你的文件作为bz2.BZ2File和使用seekread

读([大小])

阅读最多的尺寸压缩字节,返回作为 字符串。如果size参数为负数或省略,请阅读,直到EOF达到 。

seek(offset [,whence])

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

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

然后,您可以分析您的功能。

headerdict = parseHeader(headerbytes) 
+0

谢谢你的完整答案塞巴斯蒂安! @bbayles首先主要领导。在您发布完整答案之前,我实际上已经用他的评论解决了这个问题我也想给他一些信用。你知道一种方法将他添加到你的答案吗? – roho

+0

好的。我只是做了一些小的编辑。谢谢! – roho

1

如果您是确保每一个tar归档文件将只包含一个BZ2文件,你可以直接跳过第一个512个字节首先读取tar文件时(不包含在它的BZ2文件,当然),这是因为tar文件格式有一个填充(固定大小)的标题,然后存储你的“真实”内容。

简单

f.seek(512) 

,而不是遍历getmembers()应该做的伎俩。

+0

谢谢!这是有用的,但不是一个完整的答案。 – roho