mstorライブラリを使用してmboxメールファイルを解析しています。一部のファイルのサイズがギガバイトを超えています。ご想像のとおり、これによりヒープスペースの問題が発生する可能性があります。
反復ごとに特定のメッセージを取得するループがあります。呼び出しは、getMessage()
ヒープスペースが不足したときに割り当てようとしているものです。このループの先頭にに呼び出しを追加するとSystem.gc()
、プログラムは大きなファイルをエラーなしで解析しますが、ガベージを40,000回収集すると、プログラムの速度が低下する必要があることに気付きます。
私の最初の試みは、if (i % 500 == 0) System.gc()
500レコードごとに呼び出しが発生するように呼び出すことでした。この数値を上げ下げしてみましたが、結果に一貫性がなく、通常はOutOfMemoryエラーが返されます。
私の2番目の、より巧妙な試みは次のようになります。
try {
message = inbox.getMessage(i);
} catch (OutOfMemoryError e) {
if (firstTry) {
i--;
firstTry = false;
} else {
firstTry = true;
System.out.println("Message " + i + " skipped.");
}
System.gc();
continue;
}
OutOfMemoryエラーがスローされた場合にのみガベージコレクターを呼び出し、カウントをデクリメントして再試行するという考え方です。残念ながら、数千通の電子メールを解析した後、プログラムは出力を開始します。
Message 7030 skipped.
Message 7031 skipped.
....
残りの部分についても同様です。
反復ごとにコレクターをヒットすると、これとは異なる結果がどのように返されるかについて、私は混乱しています。私の理解では、ごみはごみであり、これを変える必要があるのは、特定の時間に収集される量だけです。
誰かがこの奇妙な行動を説明できますか?コレクターに電話をかける頻度を減らす他の方法についての推奨事項はありますか?ヒープスペースがいっぱいになりました。