現在のプロジェクトで問題が発生しています。誰かが助けてくれることを願っています。
私のプロジェクトでは、DB からデータをロードし、HashMap に保存して処理する必要があります (約 500 万のレコードがあります)。
それはかなりうまくいきます。そして、少し調整するために、この HashMap オブジェクトをファイルに保存することにしました。これにより、このプログラムを再実行する必要があるときに時間を節約できることを願っています。
そして、その HashMap をファイルに書き込んでいるときに問題が発生します。メモリ不足です。
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("filename"));
out.writeObject(hashMap);
out.flush();
out.close();
私の質問は
- この問題を解決するにはどうすればよいですか?
- オブジェクトを保存するときにメモリが不足する原因は、この HashMap を処理しているときに問題がなく、オブジェクトを保存するときに余分なメモリを必要としないためです(私は間違っています)。
(私はEclipseで開発しており、EclipseでJavaアプリとして実行してテストしています)
スタックトレースを更新
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.io.ObjectOutputStream$HandleTable.growEntries(ObjectOutputStream.java:2331)
at java.io.ObjectOutputStream$HandleTable.assign(ObjectOutputStream.java:2256)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1412)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
at java.util.HashMap.writeObject(HashMap.java:1100)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
私のディスク容量は約 8GB で、問題はないと思います。
どんな提案でも大歓迎です!ありがとうございました。