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 をチェックしています。