0

これが私のユースケースです:

  • 約1Kの小さなエントリを約8Mのアーカイブファイルに保存したいと思います。
  • (ファイル全体を読まずに)個々のエントリを効率的に読めるようにしたい。
  • アーカイブを効率的に圧縮できるようにしたい。私が実行したテストでは、TAR+ZIPアーカイブは単なるZIPアーカイブの4分の1でした。これはまったく驚くべきことではありません。個々の1Kエントリを圧縮する機会はあまりありません。
  • アーカイブを更新する必要はありません。一度作成されると、それは不変です。

両方(グローバル圧縮+個別アクセス)をサポートするアーカイブ形式はありますか?理論的には、2つの目標は相互に排他的ではありません。

注:これはJavaプロジェクト用であるため、Javaライブラリも含む形式に制限されています。

4

2 に答える 2

2

私はあなたの問題に対する既製の解決策を認識していないので、自分で書く必要があるかもしれません.

それは確かにできます。シンプルでよく理解できる tar 形式を使用しますが、圧縮アーカイブへのインデックス情報を含む補助ファイルが必要になります。行うことは、tar ファイルの圧縮を制御して、履歴を必要としないエントリ ポイントを作成することです。これらのエントリ ポイントは、良好な圧縮を可能にするために 1K よりもはるかに離れている必要がありますが、1K ファイルへの比較的高速なランダム アクセスを提供するために十分に接近させることができます。

最も簡単な方法は、gzip を使用して、合計で約 128K バイトになる完全なファイルのセットを表す tar ファイルのチャンクを個別に圧縮することです。gzip ストリームは単純に連結でき、結果の .tar.gz ファイルは tar ユーティリティで正常に機能します。連結された有効な gzip ストリームは有効な gzip ストリームでもあるという gzip 形式のプロパティです。

補助ファイルには、tar アーカイブ内のファイルのリスト、圧縮されていない tar ファイル内のファイルのサイズとオフセット、および各 gzip ストリームの開始点の圧縮されたオフセットと圧縮されていないオフセットが個別に含まれます。次に、ファイルを抽出するときに、圧縮されていない tar ファイルでそのオフセットを探し、そのファイルのオフセット以下の最大の圧縮されていないオフセットを持つ gzip ストリームを見つけ、そのファイルに到達するまで、対応する圧縮されたオフセットから解凍を開始します。 .

この例では、アーカイブ内の任意のファイルを取得するために、平均して 64K を解凍するだけで済みます。

于 2013-02-19T19:18:21.327 に答える
0

一般に、構築された圧縮テーブルには、それを参照する圧縮データが散在しています。

自分で圧縮したい場合、1つの方法は次のとおりです。

[sharedcompression table]...

[compression table addition specific to file 1] [file 1]
 ,,          ,,             ,,       ,, ,,   2   ,,   2
...

最後にシャッフル/共有圧縮テーブル パーツ。

7zip や bzip などに対抗できるかどうかが問題です。

ところで、Java zip 処理 (まだ?) は、ファイルの末尾にあるオプションのファイル インデックスを使用しません。

于 2013-02-19T18:22:33.633 に答える