2015-11-23 58 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