2013-05-31 7 views
7

かなり大きなアルゴリズムでテキストファイルとは異なるデータを評価しています。Java GCのオーバーヘッドの上限を超えました - カスタムソリューションが必要です

テキストファイルには、データポイント(私は必要最低限​​がかなっている130万個のデータポイントのように。)それは次のエラーを与えるよりも多く含まれている場合:

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded 
    at java.util.regex.Matcher.<init>(Unknown Source) 
    at java.util.regex.Pattern.matcher(Unknown Source) 
    at java.lang.String.replaceAll(Unknown Source) 
    at java.util.Scanner.processFloatToken(Unknown Source) 
    at java.util.Scanner.nextDouble(Unknown Source) 

私は次の設定でEclipseでそれを実行しています私はテキストファイルの一部を通る場合、それが正常に動作することを

-Xms20m -Xmx1024m -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -XX:NewSize=10m 
-XX:MaxNewSize=10m -XX:SurvivorRatio=6 -XX:TargetSurvivorRatio=80 
-XX:+CMSClassUnloadingEnabled 

注:インストールJRE6(標準VM)のために。

は今、私はこのテーマについて多くを読んで、どこかに私がデータ漏洩または私は(私は私がそう思う)の配列でも多くのデータを格納していますいずれかが必要と思われます。

今私の問題がある:私はこの問題を回避することができますか?

  • 計算を実行できるように自分の設定を変更することはできますか、本当により多くの計算能力が必要ですか?私はそれが配列内のデータを入れて、それはそれを処理させるよりも、CPUのIDのとポインタを使用することをお勧めしますことをどこかで読ん
  • (つまりを得るには考え)。しかし、ポインタだけを提供するようにコードを変更するにはどうすればよいですか?

基本的に私は膨大なメモリの記憶/リークを防ぐための一般的なガイドラインを探しています。

+0

どのような意味があるのか​​正確に知ることができますか?私たちが持っているのは、あなたが思っていることだけです。 –

+0

私はこれを読んでいます:http://stackoverflow.com/questions/1393486/what-does-the-error-message-java-lang-outofmemoryerror-gc-overhead-limit-excee –

+2

私はあなたがこのためのプロファイラー。私は特にvisualgcをお勧めします。 –

答えて

3

本当に重要なVMの引数は、メモリの1024メガバイトまで使用してVMに指示され、-Xmx1024mです。最も簡単な解決策は、そこに大きな番号を使用することです。 -Xmx2048mまたは-Xmx4096m、またはそれに対応する十分なRAMがマシンにあると仮定して、任意の数値を試すことができます。

私はあなたが他のVMの引数のいずれかのうち、多くの利益を取得しているかわかりません。ほとんどの場合、Javaに使用するスペースを教えれば、それは残りのパラメータとともにスマートになります。私は-Xmx paramを除いてすべてを削除し、それがどのように実行されるのかを見ることをお勧めします。

より良い解決策は、あなたのアルゴリズムを改善しようとすることですが、私はまだ提案を提供するために十分な詳細にそれを読んでいません。

+0

それは意味をなさないようです。だから私は約4 RAMがあります。つまり、私は約-Xmxを約2048に増やすことができるはずです。私は明日それを試して、それがうまくいくかどうかを知らせます。 (ここは夕方です) –

+2

正しい。あなたが運が良ければ、それはあなたのデータセットにとって十分であり、より困難で時間のかかる変更を気にする必要はありません。 4GBの合計で、あなたはおそらくあなたのVMで最大3GBを得ることができますが、他のいくつかのプログラムを閉じる必要があるかもしれません。 –

+0

それがうまくいくなら、私はあなたに非常に短いしかし効率的な解決のためのポイントを与えるでしょう –

1

私はあなた

  • があなたのメモリ使用量を最小限に抑えるためにプロファイラを使用することをお勧め。私は、プリミティブ、バイナリデータ、およびよりコンパクトなコレクションを使用することで、10倍以上に減らすことができると考えています。
  • あなたのマシンのメモリを増やしてください。私が最後に何百もの信号をテストしたとき、私は256GBのメインメモリを持っていましたが、これは時には十分ではありませんでした。より多くの記憶を得ることができます。
  • メモリマップファイルを使用してメモリ効率を向上させます。
  • データセットのサイズを、マシンとプログラムがサポートできるときに減らしてください。
+0

「256 GBのメインメモリ」とはどういう意味ですか? –

+0

マシンには256 GBのメモリがあり、ほとんどすべてを使っていたメモリマップファイルを使用しています。 –

+0

うわー!それは非常に大きなプロジェクトでした。私の最大のファイル(データベースとしての役割を果たす.txtファイル)は約70MBなので、大丈夫です。私は私の考えを単純化して問題を解決しました。私は、Eclipseが使用することが許された最大メモリを単に増やさなければなりませんでした(すでに1024mにしていますが)。私はこれらの 'メモリマップされたファイル'に興味がありますので、将来の使用のためにそれを読み上げます。あなたの時間と答えをありがとう! –

3

あなたはそれも-Xmx JVM引数を使用した後、1つのコンピュータのメモリに収まらない場合は、あなたが取り組んで多くのコンピュータを使用して、クラスタコンピューティングに移動したい場合があり、データサイズが、実際には非常に大きいことを言っているとおりあなたの問題。このためには、Message Passing Interface(MPI)を使用する必要があります。

MPJ Expressは、JavaのためのMPIの非常に良い実装である、またはC/Cのような言語で++ Open MPImpich2のような既存のMPIのためのいくつかの良い実装があります。私はこの状況であなたを助けるかどうかはわかりませんが、将来のプロジェクトでは必ずあなたを助けます。

+0

ありがとう!素晴らしい代替手段! –

関連する問題