7

このコードを使用して、ファイルのリストを含む .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」に送信する前に何かを書き込むと、別のバッファ サイズを選択した場合とは結果ファイルのバイト サイズが異なる場合があります。

つまり、アルゴリズムが次のようになっているかどうかはわかりません。

データの読み取り-->データの処理-->.ZIP の作成

また

データのチャンクを読み取る-->データのチャンクを処理する-->.ZIPにチャンクを書き込む-->| ^-------------------------------------------------- -------------------------------------------------- --------------------------

この場合、最適なバッファ サイズはどれくらいですか?

アップデート:

このコードをテストし、バッファー サイズを 1024 から 64 に変更して、同じファイルを圧縮しました。1024 バイトでは、80 KB の結果ファイルは、64 バイトのバッファーよりも 3 バイト小さくなりました。最も短い時間で最小の .zip を生成するのに最適なバッファー サイズはどれですか?

4

2 に答える 2

10

簡単な答え: 16k のようなものを選びます。


長い答え:

ZIP は、圧縮に DEFLATE アルゴリズムを使用しています ( http://en.wikipedia.org/wiki/DEFLATE )。Deflate は Ziv Lempel Welch の一種です (Wikipedia で LZW を検索してください)。DEFLATE は、LZ77 およびハフマン コーディングを使用します。

これは辞書圧縮であり、アルゴリズムの観点から私が知る限り、デフレーターにデータを供給するときに使用されるバッファー サイズはほとんど影響を与えません。LZ77 の最大の影響は、例のバッファー サイズによって制御されない辞書サイズとスライディング ウィンドウです。

必要に応じてさまざまなバッファー サイズを試してグラフをプロットできると思いますが、圧縮率 (3/80000 = 0.00375%) に大きな変化は見られないと確信しています。

バッファー サイズが持つ最大の影響は、FileInputStream.read および zos.write を呼び出すときに実行されるオーバーヘッド コードの量による速度です。この観点から、何を得るか、何を費やすかを考慮する必要があります。

1 バイトから 1024 バイトに増やすと、(理論上) 1023 バイトが失われ、.read および .write メソッドのオーバーヘッド時間が最大 1024 削減されます。ただし、1k から 64k に増やすと、63k を消費することになり、オーバーヘッドが 64 分の 1 に削減されます。

したがって、これには収益の減少が伴うため、中間のどこか (16k としましょう) を選択し、それを維持します。

于 2008-10-14T14:22:23.060 に答える
0

使用しているハードウェアによって異なります (ディスク速度とファイル検索時間)。パフォーマンスの最後の低下を絞り込むことに興味がない場合は、4k から 64k の間の任意のサイズを選択してください。寿命の短いオブジェクトなので、とにかくすぐに回収されます。

于 2008-10-14T13:08:45.893 に答える