以下のように私はJavaを使用してZIPファイルを読んでいます:私はメモリ不足エラーを取得していますJavaで巨大なZipファイルを読み込む - メモリ不足エラー
Enumeration<? extends ZipEntry> zes=zip.entries();
while(zes.hasMoreElements()) {
ZipEntry ze=zes.nextElement();
// do stuff..
}
、zipファイルのサイズは160メガバイト程度です。スタックトレースは以下の通りです:
Exception in thread "Timer-0" java.lang.OutOfMemoryError: Java heap space
at java.util.zip.InflaterInputStream.<init>(InflaterInputStream.java:88)
at java.util.zip.ZipFile$1.<init>(ZipFile.java:229)
at java.util.zip.ZipFile.getInputStream(ZipFile.java:229)
at java.util.zip.ZipFile.getInputStream(ZipFile.java:197)
at com.aesthete.csmart.batches.batchproc.DatToInsertDBBatch.zipFilePass2(DatToInsertDBBatch.java:250)
at com.aesthete.csmart.batches.batchproc.DatToInsertDBBatch.processCompany(DatToInsertDBBatch.java:206)
at com.aesthete.csmart.batches.batchproc.DatToInsertDBBatch.run(DatToInsertDBBatch.java:114)
at java.util.TimerThread.mainLoop(Timer.java:534)
at java.util.TimerThread.run(Timer.java:484)
私は私のヒープサイズを増やすことなく、大きなzipファイルの内容を列挙する方法を教えてください。また、内容を列挙せずにこのような単一のファイルにアクセスすると、次のようになります。
ZipFile zip=new ZipFile(zipFile);
ZipEntry ze=zip.getEntry("docxml.xml");
次に、メモリ不足エラーが発生しません。なぜこれが起こるのですか? ZipファイルはZipエントリをどのように処理しますか?もう1つのオプションは、ZIPInputStreamを使用することです。それは小さなメモリフットプリントを持っていますか?私は彼らに
Enumeration<? extends ZipEntry> zes=zip.entries();
while(zes.hasMoreElements()) {
ZipEntry ze=zes.nextElement();
S3Object s3Object=new S3Object(bkp.getCompanyFolder()+map.get(ze.getName()).getRelativeLoc());
s3Object.setDataInputStream(zip.getInputStream(ze));
s3Object.setStorageClass(S3Object.STORAGE_CLASS_REDUCED_REDUNDANCY);
s3Object.addMetadata("x-amz-server-side-encryption", "AES256");
s3Object.setContentType(Mimetypes.getInstance().getMimetype(s3Object.getKey()));
s3Object.setContentDisposition("attachment; filename="+FilenameUtils.getName(s3Object.getKey()));
s3objs.add(s3Object);
}
を取得した後、私はZIPエントリを処理する方法についてより多くの情報を提供する:私は、Amazonクラウド(613メガバイトのRAM)
EDIT上のマイクロEC2インスタンス上で、最終的にこのコードを実行する必要があります
私はzipinputstreamをzipentryから取得し、それをS3オブジェクトに格納します。私はリスト内のすべてのS3Objectを収集し、最終的にそれらをAmazon S3にアップロードします。 Amazon S3を知らない人にとっては、ファイルストレージサービスです。 HTTP経由でファイルをアップロードします。
これは起こっているすべての個々の入力ストリームを収集していると思いますか?もし私がそれをバッチアップするのに役立つでしょうか?一度に100の入力ストリームのように?または、私はそれを最初に解凍し、圧縮されていないファイルを使用してストリームを格納するよりもアップロードする方が良いでしょうか?
Micro EC2インスタンスタイプは、大きなファイルの解凍には適していません。これは非常に短い期間のCPU作業しかサポートしません。解凍に2〜5秒以上かかる場合は、Microインスタンスでは非常に簡単ですが、これは動作しません(tm)。 [.NET Frameworkのインストールのようなものでも、CPUを使用するため、.NETフレームワークのインストールには30分かかります] –
Kieren、現時点では2GMのローカルubuntuサーバー上で実行していますRAM :)。ここで失敗した場合、私はそれがマイクロインスタンス上で動作しないことを確信しています。しかし、いったんCodoの提案を使って修正すれば、まだ問題はあると思いますか?私がやっているのは、S3からzipファイルをダウンロードし、解凍してJavaバッチプログラムでS3にアップロードすることです。それはCPU集約的でしょうか?また、同じインスタンスでtomcatとmysql dbを実行しています。それは悪くなるだろうか? – sethu
10秒以下であれば、頻繁に行う必要がない限り、OKになります。 10を超えると、インスタンスに使用可能なCPUが非常に短くなり、数分かかり、インスタンス全体が遅くなります。 –