ファイルから大量のデータを読み取るアプリケーションで作業しています。基本的には、私は巨大なファイル(約1.5-2ギグ)を持っていて、さまざまなオブジェクトを含んでいます(ファイルごとに5〜10百万です)。私はそれらのすべてを読んで、それらをアプリ内の別の地図に置く必要があります。問題は、ある時点でオブジェクトを読み取っているときにアプリがメモリ不足になることです。 -Xmx4096mを使用するように設定した場合にのみ、ファイルを処理できます。しかし、ファイルが大きくなると、それ以上はできなくなります。Javaで大きなファイルを読み込んでいるときにOutOfMemory例外を回避する方法
ここでコードスニペットです:すべての
String sampleFileName = "sample.file";
FileInputStream fileInputStream = null;
ObjectInputStream objectInputStream = null;
try{
fileInputStream = new FileInputStream(new File(sampleFileName));
int bufferSize = 16 * 1024;
objectInputStream = new ObjectInputStream(new BufferedInputStream(fileInputStream, bufferSize));
while (true){
try{
Object objectToRead = objectInputStream.readUnshared();
if (objectToRead == null){
break;
}
// doing something with the object
}catch (EOFException eofe){
eofe.printStackTrace();
break;
} catch (Exception e) {
e.printStackTrace();
continue;
}
}
} catch (Exception e){
e.printStackTrace();
}finally{
if (objectInputStream != null){
try{
objectInputStream.close();
}catch (Exception e2){
e2.printStackTrace();
}
}
if (fileInputStream != null){
try{
fileInputStream.close();
}catch (Exception e2){
e2.printStackTrace();
}
}
}
まず、私はobjectInputStream.readObject()の代わりobjectInputStream.readUnshared()を使用していたので、それは部分的に問題を解決しました。 2048から4096にメモリを増やしたとき、ファイルの解析が開始されました。 BufferedInputStreamはすでに使用されています。ウェブからは、行やバイトを読み込む方法の例だけが見つかりましたが、オブジェクトに関するものは何もなく、パフォーマンスは賢明です。
JVMのメモリを増やさずにファイルを読み取って、OutOfMemory例外を回避するにはどうすればよいですか?ファイルからオブジェクトを読み取る方法はありますか?メモリ内に何も保持しないでください。
単純な物理学です。ファイルが大きくなると、より多くのメモリが必要になります。そこに魔法はありません。ファイルにはオブジェクトが含まれていません。オブジェクトにマップされている文字列にマップされたバイトが含まれています。 – duffymo
メインファイルを読み込んでいるときにマップにデータを並べ替えることができれば、BufferReaderを使用してファイルを行単位で読み込み、PrintWriterを使用して既存のファイルにデータを追加したり、新しいファイルを作成したりできます。 – Jure
ファイルが大きすぎる場合は選択肢がありませんが、F.S.に保存してください。それを読む:https://commons.apache.org/proper/commons-jcs/ –