2009-09-30 3 views
9

bzip2ファイル(5GB以上)があり、私のデータがどこにあるのか(毎回ブロックが異なるため)ブロック#xを解凍したいとします。どうすればいい?特定のbzip2ブロックのみを解凍する

私はすべてのブロックのインデックスを作成し、ファイルから必要なブロックを切り取り、bzip2recoverを適用することを考えました。

私は一度に1MBというファイルを圧縮して、ファイルに追加して(場所を記録して)、必要なときにファイルを取得することも考えましたが、オリジナルのbzip2ファイルをそのまま維持したいと考えています。

私の好みの言語はRubyですが、どの言語の解決策も私のものです(原則を理解している限り)。

答えて

6

http://bitbucket.org/james_taylor/seek-bzip2

グラブ源があり、それをコンパイルします。

テストに

./seek-bzip2 32 < bzip_compressed.bz2 

で実行します。

唯一のパラメータは、不思議なブロックヘッダのビット置換です。 バイナリファイルに "31 41 59 26 53 59"の16進文字列が含まれています。これは間違っていました。ブロック開始がバイト境界に揃えられていない可能性があるので、bzip2recoverで行われているように、 "31 41 59 26 53 59"の16進文字列を検索する必要があります。http://www.bzip.org/1.0.3/html/recovering.html

32は "BZh1 "ヘッダは" 1 "から" 9 "(古典的なbzip2)の任意の数字にすることができます - それは数百kb単位の(非圧縮の)ブロックサイズです(正確ではありません)。

+0

sic!ブロック開始はバイト境界ではありません:(オリジナルのデータブロックサイズのビット変位とサイズのリストを取得するために "seek-bzip2"に含まれるbzipテーブルのプログラムがあります) – osgx

+0

"bzip-table"はほぼ同じです実際に解凍する速度:(それはほぼ完全な解凍サイクルを行いますが、CRCをチェックしません – osgx

+0

また、Jeff Gilchristのpbzip2のような並列bzipsを見てください。並列解凍では、ブロックヘッダーを検索する必要があります。 http://www.google.com/codesearch/p?hl=en#calSvFpbfuI/trunk/trunk/demo/pbzip2-1.0.2/pbzip2.cpp&q=pbzip2&sa=N&cd=2&ct=rc&l=3 'producer_decompress'関数 – osgx

2

bzip-tableは圧縮解除とほぼ同じくらい遅いですが、一度やり直すだけで済みますし、何らかの形で出力を保存してインデックスとして使用することもできます。これは私が必要とするものには完璧ですが、みんなが必要とするものではないかもしれません。

Windowsでコンパイルするのに少し助けが必要でした。

+0

msysでmingwを試してください – osgx

+0

http://sourceforge.net/projects/mingw/files/Automated%20MinGW%20Installer/mingw-get-inst/mingw-get-inst-20110316/mingw-get-inst-20110316.exe/download – osgx

関連する問題