5

Javaでgzip形式の約8000個のファイルを解凍しようとしています。私の最初の試みは GZIPInputStream を使用することでしたが、パフォーマンスはひどいものでした。

gzipアーカイブを解凍するための代替手段を知っている人はいますか? ZipInputStream を試しましたが、gzip 形式を認識しません。

前もって感謝します。

4

3 に答える 3

8

バッファリングを使用する必要があります。小さなデータを書き込むのは非効率的です。圧縮の実装は、Sun JDK のネイティブ コードにあります。バッファされていない場合でも、パフォーマンスは通常、妥当なファイルまたはネットワーク I/O を超えるはずです。

OutputStream out = new BufferedOutputStream(new GZIPOutputStream(rawOut));

InputStream in = new BufferedInputStream(new GZIPInputStream(rawIn));

解凍/圧縮アルゴリズムを実装するためにネイティブ コードが使用されるため、使用後はストリーム (基になるストリームだけでなく) を閉じるように十分注意してください。たくさんの「デフレーター」をぶらぶらさせていると、パフォーマンスが非常に悪いことがわかりました。

ZipInputStreamファイルのアーカイブを扱います。これは、ストリームの圧縮とはまったく異なります。

于 2009-03-10T17:47:37.157 に答える
4

のパフォーマンスがひどかったと言うときGZipInputStream、もっと具体的に言えますか? CPU のボトルネックなのか、I/O のボトルネックなのかわかりましたか? 入力と出力の両方でバッファリングを使用していましたか? 使用していたコードを投稿できれば、非常に役立ちます。

マルチコア マシンを使用している場合は、GZipInputStreamコアごとに 1 つずつ複数のスレッドを使用して、処理するファイルの共有キューを使用することもできます。(1 つのファイルは 1 つのスレッドによってのみ処理されます。) I/O バウンドの場合は状況が悪化する可能性がありますが、試してみる価値はあります

于 2009-03-10T17:50:31.877 に答える
-2

この種のスケールでは、プラットフォーム要件が限られていると仮定すると、ネイティブに移行することをお勧めします。JNI を使用して、ライブラリを呼び出したり、.NET を使用してネイティブ コマンドを呼び出したりできますProcessBuilder

于 2009-03-10T17:45:53.620 に答える