1

org.apache.commons.math3.distribution.NormalDistribution大規模な分散 Scala & Akka アプリケーションで使用しています。デバッグ中sample()に時々 NaN が返されることがわかりました。これは静かに伝播し、スレッドがハングアップする原因となりました。org.apache.commons.math3.ode.nonstiff.DormandPrince853Integrator

NaN は、並列コレクションで簡単に再現できます (シーケンシャル コードでは発生しません)。

val normal = new NormalDistribution(0,0.1)
(1 to 1000000000).par.foreach{i =>
    val r = normal.sample
    if(r.isNaN()) throw new Exception("r = "+r)
}

この場合、明らかにval normal内部を移動foreachすると問題が解決します。

ドキュメントを見ましたが、そのような問題について警告するものは何もありません。スレッドセーフに関するより基本的な概念を理解できていませんか? 言うまでもなく、私は今 NaN をチェックしています。

4

4 に答える 4

2

normal妥協点は、おそらく Twitter のLocal実装を使用して、スレッド ローカルとして作成することです。

これは、normal.sampleメソッドが特に高価な場合に役立ちます。また、2 つの並列操作が同じスレッドで同時に実行されないことも確認できます :)

于 2014-01-07T11:09:48.310 に答える
1

スレッドごとに別のスレッド セーフ ジェネレーターまたは NormalDistribution のインスタンスを使用するか、単一のインスタンスへのアクセスを同期してみてください。マルチスレッド環境で非スレッドセーフなオブジェクトを使っていると思うので

于 2014-01-07T10:55:19.690 に答える
1

おそらく、マルチスレッド環境でスレッドセーフでないオブジェクトを使用しているために追加されます(サンプルメソッドを2回以上同時に呼び出しています)。スレッドごとに別のスレッドセーフなジェネレーターまたは NormalDistribution のインスタンスを使用するか、単一のインスタンスへのアクセスを同期する必要があります (おそらく、par 実行の利点が失われます)。

于 2014-01-07T10:51:05.973 に答える