10

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

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

また、一度に 1MB ずつ圧縮し、これをファイルに追加 (および場所を記録) し、必要なときにファイルを取得することも考えましたが、元の bzip2 ファイルをそのまま保持したいと思います。

私の好みの言語は Ruby ですが、どの言語のソリューションでも問題ありません (原理を理解している限り)。

4

2 に答える 2

6

http://bitbucket.org/james_taylor/seek-bzip2があります。

ソースを入手してコンパイルします。

で実行

./seek-bzip2  32 < bzip_compressed.bz2 

テストする。

唯一のパラメーターは、不思議なブロック ヘッダーのビット置換です。バイナリファイルで「31 41 59 26 53 59」の 16 進文字列を見つけることで取得できます。これは間違っていました。ブロックの開始はバイト境界に揃えられていない可能性があるため、bzip2recover - http://www.bzip.org/1.0. 3/html/recovering.html

32 は "BZh1" ヘッダーのビット サイズで、1 は "1" から "9" までの任意の数字です (従来の bzip2 の場合) - これは (非圧縮の) ブロック サイズで数百 kb です (正確ではありません)。

于 2010-09-13T14:17:46.623 に答える
2

確かに、bzip-table は圧縮解除とほぼ同じくらい遅いですが、もちろん一度だけ実行する必要があり、出力を何らかの方法で保存してインデックスとして使用することができます。これは私が必要とするものには完璧ですが、すべての人が必要とするものではないかもしれません.

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

于 2010-12-15T16:48:12.147 に答える