比方說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每隔一段時間同步一次,是否有任何工具只是讀取它的結尾而不處理它?
檢查出重複的問題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
這個問題真的有與我的問題無關,'Z_FULL_FLUSH'纔是真正的解決方案。 – taw 2014-04-09 22:56:14
酷!你能發佈你的解決方案嗎? – 2015-01-29 20:49:14