2010-07-25 75 views
14

比方說file.txt.gz有2GB,我想看最後100行左右。 zcat <file.txt.gz | tail -n 100會經歷所有這一切。讀取gzip文本文件的最後一行

據我所知,壓縮文件不能隨機訪問,如果我剪掉它的最後5MB,那麼剪切後的數據將是垃圾 - 但可以gzip重新同步並解碼流的其餘部分?

如果我沒有理解它正確的gzip流是描述如何輸出命令的簡單流 - 它應該是可能的,要同步。然後是最近一次未壓縮數據的32kB滑動窗口 - 當然如果我們在中間開始的時候它會以垃圾的形式出現,但我猜測它通常會很快被真實數據填滿,並且從這一點開始解壓縮是微不足道的(好吧,有可能從文件開始到結束都會一遍又一遍地重複出現,因此滑動窗口永遠都不會清除 - 如果這是常見的 - 如果發生這種情況,我們只處理整個文件,這會讓我感到驚訝)。

我不是非常急於做這個親屬的gzip的兩輪牛車自己 - 沒有人這麼做過,用於處理損壞的文件,如果沒有別的?

或者 - 如果真的gzip的不能做到這一點,是有可能的工作非常喜歡它的任何其他流壓縮程序,除非他們允許重新同步中流?

編輯:我發現pure Ruby reimplementation of zlib和砍死它內滑動窗口打印字節的青睞。事實證明,事情會被一遍又一遍地複製很多,甚至在5MB +滑動窗口仍然包含前100個字節的東西以及整個文件中的隨機位置。

我們甚至無法通過讀取前幾個塊和最後幾個塊來解決這個問題,因爲那些第一個字節沒有直接引用,它只是一個非常長的副本鏈,並且唯一的方法就是找出它指的是什麼是通過處理這一切。

本質上,使用默認選項,我想要的可能是不可能的。

在另一方面zlib的具有Z_FULL_FLUSH選項進行同步的目的,清除了這個滑動窗口。所以問題依然存在。假設zlib每隔一段時間同步一次,是否有任何工具只是讀取它的結尾而不處理它?

+0

檢查出重複的問題http://stackoverflow.com/questions/14225751/random-access-to-gzipped-files和zran http://www.zlib.net/zlib_faq.html#faq28 – 2014-04-08 22:24:03

+1

這個問題真的有與我的問題無關,'Z_FULL_FLUSH'纔是真正的解決方案。 – taw 2014-04-09 22:56:14

+0

酷!你能發佈你的解決方案嗎? – 2015-01-29 20:49:14

回答

1

Z_FULL_FLUSH發出已知的字節序列(00 00 FF FF),你可以用它來進行同步。 This link可能是有用的。

+6

鏈接已死亡... – stepancheg 2011-01-07 02:19:06

0

這是塊和流密碼的區別。由於gzip是一個流密碼,因此您可能需要整個文件達到某個點才能解密該點的字節。

正如你所提到的那樣,當窗口被清除時,你就是金。但是並不能保證zlib實際上對你來說足夠經常這麼做......我建議你從文件末尾向後尋找並找到完整刷新的標記。

相關問題