Javaを使用して.zipアーカイブを作成するためのバッファーサイズは?
質問
このコードを使用して、ファイルのリストを含む.zipを作成します:
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile));
for (int i=0;i<srcFiles.length;i++){
String fileName=srcFiles[i].getName();
ZipEntry zipEntry = new ZipEntry(fileName);
zos.putNextEntry(zipEntry);
InputStream fis = new FileInputStream(srcFiles[i]);
int read;
for(byte[] buffer=new byte[1024];(read=fis.read(buffer))>0;){
zos.write(buffer,0,read);
}
fis.close();
zos.closeEntry();
}
zos.close();
zipアルゴリズムとZipOutputStreamがどのように機能するのかわかりません。すべてのデータを読み取り、「zos」に送信する前に何かを書き込むと、結果ファイルのバイトサイズが別のものを選択した場合と異なる場合がありますバッファサイズ。
言い換えれば、アルゴリズムが次のようなものかどうかわかりません:
データの読み取り-&gt;データの処理--gt; .ZIPの作成
または
データのチャンクを読み取る->>データのチャンクを処理する->; ZIPにチャンクを書き込む->; | ^ ------------------------------------------------- -------------------------------------------------- --------------------------
この場合、どのバッファーサイズが最適ですか?
更新:
このコードをテストして、バッファサイズを1024から64に変更し、同じファイルを圧縮しました。1024バイトでは、80 KBの結果ファイルは64バイトのバッファよりも3バイト小さくなりました。最短時間で最小の.zipを生成するのに最適なバッファーサイズはどれですか?
解決
簡単な答え:16kのようなものを選びます。
長答:
ZIPは圧縮にDEFLATEアルゴリズムを使用しています( http://en.wikipedia.org/wiki/DEFLATE )。 DeflateはZiv Lempel Welch(LZWの検索ウィキペディア)のフレーバーです。 DEFLATEはLZ77とハフマンコーディングを使用します。
これは辞書圧縮であり、アルゴリズムの観点から知る限り、デフレーターにデータを供給する際に使用されるバッファーサイズはほとんど影響を与えません。 LZ77の最大の影響は、辞書のサイズとスライディングウィンドウであり、これらは例のバッファサイズによって制御されません。
必要に応じてさまざまなバッファサイズを試してグラフをプロットできると思いますが、圧縮率に大きな変化は見られないと確信しています(3/80000 = 0.00375%)。
バッファサイズの最大の影響は、FileInputStream.readおよびzos.writeを呼び出したときに実行されるオーバーヘッドコードの量による速度です。この観点から、あなたが得るものとあなたが使うものを考慮すべきです。
1バイトから1024バイトに増やすと、1023バイトが失われ(理論上)、. readメソッドと.writeメソッドでオーバーヘッド時間を約1024削減できます。 ただし、1kから64kに増やすと、63kを費やしてオーバーヘッドを64倍減らします。
これにより、収益が減少するため、中央のどこか(たとえば16k)を選択し、それを維持します。
他のヒント
お使いのハードウェアに依存します(ディスク速度とファイル検索時間)。パフォーマンスの最後の低下を絞ることに興味がない場合は、4k〜64kのサイズを選択してください。短命のオブジェクトなので、とにかくすぐに収集されます。