今、私はデータベースから巨大なデータをベクトルにロードする必要がありますが、私は38000行のデータをロードすると、プログラムはOutOfMemoryError例外をスローします。 これを処理するにはどうすればよいですか?どのようにJavaの巨大なデータを処理する
私はそれを検出するための良い方法で、私のプログラムでは、いくつかのメモリリークがあるかもしれないと思う?おかげ
今、私はデータベースから巨大なデータをベクトルにロードする必要がありますが、私は38000行のデータをロードすると、プログラムはOutOfMemoryError例外をスローします。 これを処理するにはどうすればよいですか?どのようにJavaの巨大なデータを処理する
私はそれを検出するための良い方法で、私のプログラムでは、いくつかのメモリリークがあるかもしれないと思う?おかげ
あなたのJVMに多くのメモリを提供します(通常は-Xmx
/-Xms
を使用して)、またはにすべてのデータをロードしないでメモリ。
膨大な量のデータに対する多くの操作では、一度にすべてにアクセスする必要のないアルゴリズムがあります。そのようなアルゴリズムの1つのクラスはdivide and conquer algorithmsです。
あなたのプログラムがより多くのメモリを使用するか、より良い戦略を再考してみましょう。メモリに本当に多くのデータが必要ですか?
編集のための@JoshJordan tx –
あなたは、ヒープサイズを大きくしてみてくださいすることができます
java -Xms<initial heap size> -Xmx<maximum heap size>
デフォルトは
java -Xms32m -Xmx128m
最大はあなたのプラットフォーム(見た目の最大割り当て可能メモリチャンク)に応じて1024mになります。 –
彼は、このプログラムは38000行のデータの後にOutOfMemoryErrorを投げたと言っていますが、それ以上のことがあると思います。 –
私が知る限り最大限はありません。私は4GBのヒープで動作します。 – Tommy
本当にそのような大きなオブジェクトをメモリに保存する必要がありますか?
このデータで何をする必要があるかによっては、それほど大きなデータを分割したくない場合があります。
セクション単位でデータをロードします。これにより、すべてのデータを同時に処理することはできませんが、JVMに提供されるメモリを変更する必要はありません。
あなたのデータクラスを最適化することはありますか?私はメモリ内に比較的少量のデータオブジェクトを格納するときに、OutOfMemoryErrorを与えたすべてのクラスメンバーに対してintやdoubleなどのネイティブデータ型の代わりに文字列を使用しているケースを見ました。あなたのオブジェクトを複製していないことを見てください。あなたは、メモリ内のすべてのデータを持っている必要があります場合は、一般的に登場するオブジェクトをキャッシュしてみてください
のjava -Xmx512M(またはものは何でもあなたが必要と認める)
:そして、もちろん、ヒープサイズを増やします。たとえば、従業員の記録を見て、すべて職務を持っている場合は、データをロードするときにHashMapを使用し、すでに見つかった職種を再利用します。これにより、使用しているメモリ量を大幅に削減できます。
また、何かをする前に、プロファイラを使用してメモリが浪費されている場所を確認し、ガベージコレクション可能なものに参照がないかどうかを確認してください。たとえば、2000文字の文字列の最初の10文字を使用していて、新しい文字列を割り当てる代わりに部分文字列を使用した場合、実際にchar [2000 ]配列にあり、2つのインデックスが0と10を指しています。
プロファイラを使用してコードを実行すると、メモリがどのように、なぜメモリが消費されているのかを理解できます。ループを通してあなたの方法をデバッグし、インスタンス化されているものを見てください。それらの数はいくつでもあります。 JProfiler、Java Memory Profiler、list of profilers hereなどを参照してください。
私はあなたがベクトルにデータを読み込もうとしていることを知っています - そうでなければ、それらを表示しようとしている場合はNatTableを使用することを提案しました。大量のデータをテーブルに読み込むために設計されています。
他の読者には便利かもしれないと思います。
メモリマップファイルを使用します。メモリマップされたファイルは、基本的にはヒープを叩くことなく、必要なだけ大きくすることができます。デコードに適した方法でデータをエンコードする必要があります。 (多くの行をすばやくスキップするために、データ内のすべての行に固定サイズを予約することは意味があります)。
Preonこれを簡単に処理できます。これは、リレーショナルデータベースに対してHibernateが行ったバイナリコード化データと、JAXB/XStream/XmlBeans to XMLを行うことを目的としたフレームワークです。
あなたの答えをありがとう、しかし私はヒープサイズを増やしたくない、私は良いアルゴリズムを見つける必要があると思う。 – MemoryLeak
@Hooligan:データをベクターにロードする理由を教えてください。おそらく、良いアルゴリズムを提供することができます。 – Brian
私たちの古いプログラムは、このようなoutofmemoryerrorに遭遇するので、私はそれを最適化する必要があり、プログラムはすべてのデータをフィールドにロードしてからそれを処理します。 – MemoryLeak