gzip および bzip2 アーカイブへのランダム アクセスを提供するツールが存在します。
- Ghostscript ソースコードからのgzip zran.c
- James Taylorによるbzip2 seek-bzip
7zipの同様のソリューションを探しています
(目標は、解凍されたコピーを保持せずに、時々巨大な Wikipedia ダンプ ファイルをオフラインで利用することです)
gzip および bzip2 アーカイブへのランダム アクセスを提供するツールが存在します。
7zipの同様のソリューションを探しています
(目標は、解凍されたコピーを保持せずに、時々巨大な Wikipedia ダンプ ファイルをオフラインで利用することです)
何かを明確にするために、GZIP、BZIP2、および LZMA の内部を要約する方がよいと思いました。
GZIP は、実際には Deflate アルゴリズムを使用する形式です。静的なハフマン コード (deflate ドキュメントでは動的なハフマンについても言及されていますが、実際にはそれらも静的です) のため、deflate はブロック単位でエンコードする必要があります (スライディング ウィンドウは、ここでは別の用語です)。zran.c はこれらのブロックの境界を見つけたようで、(32 KiB ウィンドウ全体を埋めるために) 解凍するのに十分なデータを収集するために、いくつかの KiB の非圧縮データを含む可能性がある最大 2 つの連続したブロックをデコードしようとします。したがって、インデックステーブルがなくてもランダムアクセスは十分可能です。
BZIP2 は、実際には BWT クラスの圧縮アルゴリズムです。BWT の性質上、ブロック単位であっても不思議ではありません。個々のブロックごとに最大 900 KiB に制限されたブロックです。また、ブロックの境界は明確に定義されており、回復プロセスが容易です (巨大な個別のマーカーがあります)。したがって、一度に複数のスレッドを使用してすべてのデータを解凍することもできます。つまり、テーブルがなくてもランダム アクセスが可能です (フォーマットで既にサポートされています)。
LZMA は最大 1 GiB の辞書をサポートし、ブロック単位でエンコードされていません。ハフマン コーダーではなくレンジ コーダーを使用して確率をエンコードします。64 MiB ウィンドウ サイズ (非常に一般的な値) を考慮しても、レンジ コーダーの性質上、ウィンドウ全体がいっぱいになるまで特定のランダム ポイントで単純にデコードすることはできません。また、LZMA のステート マシンも面倒です。そのため、実装は非常に難しいか、不可能ですらあります。
おそらく、LZMA2 または PPM メソッドをそのような用途に使用できます (7-zip は 7-zip フォーマット内でそれらをサポートします)。PPM は、統計がいっぱいになるとそのモデルをフラッシュし、LZMA2 は、マルチスレッド解凍を有効にするために、ある間隔で意図的にいくつかの状態をフラッシュします。それらのランダムアクセスの実装は可能です。
私のlzopfsプロジェクトでは、lzop、gzip、bzip2、および xz ファイルへのランダム アクセスが可能です。XZ ファイルは LZMA でエンコードされているため、目的に応じて 7-zip の代わりになることを願っています。現実的なランダム アクセスを行うには、 pixzや xz-utils 5.1.x alpha のマルチスレッド モードなどのブロックされたエンコーダーを使用して xz アーカイブを作成する必要があることに注意してください。