12

我希望能夠對gzip文件進行隨機訪問。 如果預處理的結果比文件本身小得多,我可以對它進行一些預處理(比如說構建某種索引)。隨機訪問gzip流

有什麼建議嗎?

我的想法是:

  • 哈克在現有的gzip實現和序列化其解壓縮器狀態每一個,比方說,1兆字節的壓縮數據。然後進行隨機訪問,反序列化解壓縮器狀態並從兆字節邊界讀取。這看起來很難,特別是因爲我正在使用Java,而且我找不到純java gzip實現:(
  • 重新壓縮1Mb塊的文件並執行上述操作,這有兩倍的缺點所需的磁盤空間
  • 編寫一個簡單的gzip格式解析器,它不做任何解壓縮,只檢測和索引塊邊界(如果還有任何塊:我還沒有讀取gzip格式描述)

回答

6

看一看at this link(C代碼的例子)。

/* zran.c -- example of zlib/gzip stream indexing and random access 
... 

Gzip只是帶有信封的zlib。

+0

謝謝,這太酷了!如果我只是找到了一種方法,可以從Java中舒適地使用它.. – jkff 2010-03-26 22:04:03

+1

@jkff:如果您不需要跨平臺部署,請查看JNA。作爲一種調用C庫的方式,這非常容易。 – 2010-03-27 01:23:36

+0

再次感謝,我這樣做,它就像一個魅力!雷克斯,也感謝你:我使用JNA :) – jkff 2010-03-27 18:41:35

0

有趣的問題。我不明白爲什麼你的第二個選項(大塊重新壓縮文件)會使磁盤空間增加一倍。在我看來,這將是相同的,少量的開銷。如果你可以控制壓縮件,那麼這看起來是正確的想法。

也許你的意思是你無法控制輸入,因此它會翻一番。

如果你可以做到這一點,我想象將它建模爲一個CompressedFileStream類,該類用作其後備存儲,一系列1MB gzip'd斑點。讀取時,流上的Seek()會移至相應的blob並解壓縮。超過blob末尾的Read()將導致流打開下一個blob。

ps:在IETF RFC 1952中描述了GZIP,但它使用DEFLATE作爲壓縮格式。如果你按照我的想象實現了這個CompressedFileStream類,那麼沒有理由使用GZIP細化。

+0

我不喜歡第二個選項,因爲我不打算刪除原始文件,並且我無法控制它們的生成方式。然而,現在這就是我實際執行的東西(正如你所描述的那樣),但是我對此並不滿意,這就是爲什麼我問這個問題:) – jkff 2010-03-26 22:00:40

3

BGZF文件格式,兼容GZIP是由生物學家開發的。

(...) BGZF優於常規的gzip的優點是 BGZF允許尋求無需 通過整個文件掃描多達 位置被尋找。

http://picard.svn.sourceforge.net/viewvc/picard/trunk/src/java/net/sf/samtools/util/,看看BlockCompressedOutputStream和BlockCompressedInputStream.java

+2

謝謝,這很好,但我需要我的工具立即適用於現有的日誌文件,他們通常由第三方存檔器以.zip或.gzip存檔。此外,我已經有一個工作解決方案:) – jkff 2010-04-23 09:04:41