リミットCPU / Javaメソッド呼び出しのスタック?
-
22-08-2019 - |
質問
私は希少な入力文書用のOOMエラーをスローNLPライブラリ(スタンフォードNER)を使用しています。
私は最終的にこれらの文書を特定し、エラーが発生し、それらについて何を把握することを計画したが、これは、私はHadoopの中で実行している(行うのは難しいですので、私はちょうど、エラーが分割500分の379か何かを通じて17%を発生する知っています)そのような。暫定的な解決策として、私は、この特定のコールにCPUとメモリの制限を適用できるようにしたいと思います。
私はこれを行うための最善の方法がどうなるかわかりません。私の最初は、しかし一つのスレッドの固定のスレッドプールを作成し、将来に関する時限のget()を使用することです。これは、少なくとも私の可能性が多少役立つだろうウォールクロックの上限を与えるだろう。
私の質問は努力の合理的な量でこれよりも良い行うにはどのような方法があるかどうかです。
解決
ちょうどそのとき、次のいずれかに移動し、あなたが上にあった文書化され、ログのOutOfMemoryErrorをキャッチ。ガベージコレクタを使用すると、次の文書のための十分なメモリを持っていることを確認します。
(これは一つの文章が解析には長すぎるか複雑であれば、私は次の文に移動するためにスタンフォード大学の依存関係パーサで使う戦略の一つである。)
他のヒント
私はHadoopのに慣れていないんだけど、(私の記憶が正しければ、サーバー用に64Mバイト)あなたのJVMがそれに課せられた暗黙の上位メモリ境界を持っていることを忘れないでください。私はあなたのJVMがここの(オプションで実行されているものをメモリ構成をチェックします)
あなたは、このようにメモリ上限を指定することで、これを上書きすることができます:
java -Xmx512m
(たとえば)が512Mビットに制限を設定する。
CPUの割り当てを設定すると、JVMの付託外で、(あなたがすべてでそれを行うことができる場合)OS固有のメカニズムになります。
あなたはJVMから並行して、これらのジョブを派遣している場合は、シングルスレッド(または制限されたスレッド)を実行しているスレッドプールは十分にあなたを助けるかもしれません。しかし、(再び)これは実装に依存しており、より多くの詳細が必要とされています。
あなたがやろうとしているすべてがクラッシュされた文書を見つけ出すの場合は、「マップドキュメントxに約」、NLPライブラリへの呼び出しの周りにログイン置く必要があります。あなたがOOMを参照すると、マッパーのログは、運命の文書が含まれています。あなたが言ったように、あなたがしてライブラリがクラッシュし、その文書のどのような特性を決定する必要があります。
私の経験では、文書がインターネット上の人々によって作成された場合は特に、あなたはどこか狂った巨大な文書を検索します。その時点で、あなたはそのような文書をどのように処理するかを決定する必要があります。多分それらを切り捨て、それらを無視するかのいずれか。