私はそれぞれ5GBから6GBまでの大きなファイルを持っています。私の目標は、これらのファイルを圧縮し、ファイルサーブレットを使用して転送することです。私の現在のコードは時間がかかり、ブラウザでタイムアウトセッションが発生します。ファイルを圧縮するより良い方法はありますか?Javaの大きなファイルを圧縮するより良い方法はありますか?
File zipFile=new File(downloadedFileLocation.getAbsolutePath()+"/Download.zip");
FileOutputStream fos = new FileOutputStream(zipFile);
ZipOutputStream zos = new ZipOutputStream(fos);
for(File f:downloadedFileLocation.listFiles()) {
byte[] buffer = new byte[1024];
ZipEntry ze= new ZipEntry(f.getName());
zos.putNextEntry(ze);
FileInputStream in = new FileInputStream(f.getAbsolutePath());
int len;
while ((len = in.read(buffer)) > 0) {
zos.write(buffer, 0, len);
}
in.close();
zos.closeEntry();
f.delete();
}
zos.close();
fos.close();
バッファサイズを変更することで違いがありますか?
誰もがより速くzipを実行できる優れた方法を提案できますか?
物理学は「いいえ」と答えています。操作を並列化できない場合は、ファイルのサイズと数が線形になります。 @duffymoのように – duffymo
と言っています。そのため、一部のウェブサイトで「あなたのダウンロードがすぐに準備完了」と表示され、次にリンクを送信するか、URLを利用できるように更新していくクライアント側を使用します。 –
あなたのバッファは非常に小さいです(現代的なサイズは131072以上になります)が、大きな違いを生み出すことはまずありません。圧縮を避けるために、 'zos.setMethod(ZipOutputStream.STORED);'を使用することもできますが、15GBのデータを同期して処理できるとは思いません。それをバックグラウンドでジップし、結果を保存し、完了するまでクライアントにポーリングをさせます。 –