Javaでgzip形式の約8000個のファイルを解凍しようとしています。私の最初の試みは GZIPInputStream を使用することでしたが、パフォーマンスはひどいものでした。
gzipアーカイブを解凍するための代替手段を知っている人はいますか? ZipInputStream を試しましたが、gzip 形式を認識しません。
前もって感謝します。
バッファリングを使用する必要があります。小さなデータを書き込むのは非効率的です。圧縮の実装は、Sun JDK のネイティブ コードにあります。バッファされていない場合でも、パフォーマンスは通常、妥当なファイルまたはネットワーク I/O を超えるはずです。
OutputStream out = new BufferedOutputStream(new GZIPOutputStream(rawOut));
InputStream in = new BufferedInputStream(new GZIPInputStream(rawIn));
解凍/圧縮アルゴリズムを実装するためにネイティブ コードが使用されるため、使用後はストリーム (基になるストリームだけでなく) を閉じるように十分注意してください。たくさんの「デフレーター」をぶらぶらさせていると、パフォーマンスが非常に悪いことがわかりました。
ZipInputStream
ファイルのアーカイブを扱います。これは、ストリームの圧縮とはまったく異なります。
のパフォーマンスがひどかったと言うときGZipInputStream
、もっと具体的に言えますか? CPU のボトルネックなのか、I/O のボトルネックなのかわかりましたか? 入力と出力の両方でバッファリングを使用していましたか? 使用していたコードを投稿できれば、非常に役立ちます。
マルチコア マシンを使用している場合は、GZipInputStream
コアごとに 1 つずつ複数のスレッドを使用して、処理するファイルの共有キューを使用することもできます。(1 つのファイルは 1 つのスレッドによってのみ処理されます。) I/O バウンドの場合は状況が悪化する可能性がありますが、試してみる価値はあります。
この種のスケールでは、プラットフォーム要件が限られていると仮定すると、ネイティブに移行することをお勧めします。JNI を使用して、ライブラリを呼び出したり、.NET を使用してネイティブ コマンドを呼び出したりできますProcessBuilder
。