4

gzip および bzip2 アーカイブへのランダム アクセスを提供するツールが存在します。

7zipの同様のソリューションを探しています

(目標は、解凍されたコピーを保持せずに、時々巨大な Wikipedia ダンプ ファイルをオフラインで利用することです)

4

2 に答える 2

6

何かを明確にするために、GZIP、BZIP2、および LZMA の内部を要約する方がよいと思いました。

  1. GZIP は、実際には Deflate アルゴリズムを使用する形式です。静的なハフマン コード (deflate ドキュメントでは動的なハフマンについても言及されていますが、実際にはそれらも静的です) のため、deflate はブロック単位でエンコードする必要があります (スライディング ウィンドウは、ここでは別の用語です)。zran.c はこれらのブロックの境界を見つけたようで、(32 KiB ウィンドウ全体を埋めるために) 解凍するのに十分なデータを収集するために、いくつかの KiB の非圧縮データを含む可能性がある最大 2 つの連続したブロックをデコードしようとします。したがって、インデックステーブルがなくてもランダムアクセスは十分可能です。

  2. BZIP2 は、実際には BWT クラスの圧縮アルゴリズムです。BWT の性質上、ブロック単位であっても不思議ではありません。個々のブロックごとに最大 900 KiB に制限されたブロックです。また、ブロックの境界は明確に定義されており、回復プロセスが容易です (巨大な個別のマーカーがあります)。したがって、一度に複数のスレッドを使用してすべてのデータを解凍することもできます。つまり、テーブルがなくてもランダム アクセスが可能です (フォーマットで既にサポートされています)。

  3. LZMA は最大 1 GiB の辞書をサポートし、ブロック単位でエンコードされていません。ハフマン コーダーではなくレンジ コーダーを使用して確率をエンコードします。64 MiB ウ​​ィンドウ サイズ (非常に一般的な値) を考慮しても、レンジ コーダーの性質上、ウィンドウ全体がいっぱいになるまで特定のランダム ポイントで単純にデコードすることはできません。また、LZMA のステート マシンも面倒です。そのため、実装は非常に難しいか、不可能ですらあります。

おそらく、LZMA2 または PPM メソッドをそのような用途に使用できます (7-zip は 7-zip フォーマット内でそれらをサポートします)。PPM は、統計がいっぱいになるとそのモデルをフラッシュし、LZMA2 は、マルチスレッド解凍を有効にするために、ある間隔で意図的にいくつかの状態をフラッシュします。それらのランダムアクセスの実装は可能です。

于 2011-12-24T23:44:18.210 に答える
5

私のlzopfsプロジェクトでは、lzop、gzip、bzip2、および xz ファイルへのランダム アクセスが可能です。XZ ファイルは LZMA でエンコードされているため、目的に応じて 7-zip の代わりになることを願っています。現実的なランダム アクセスを行うには、 pixzや xz-utils 5.1.x alpha のマルチスレッド モードなどのブロックされたエンコーダーを使用して xz アーカイブを作成する必要があることに注意してください。

于 2014-05-04T15:46:03.510 に答える