7

私は哲学的な議論の大規模なデータセットを持っており、それぞれが与えられたステートメントの証明または反証として他の議論に接続しています。ルートステートメントには多くの証明と反証が含まれる可能性があり、それぞれに証明と反証が含まれる場合があります。ステートメントは複数のグラフで使用することもでき、グラフは「与えられたコンテキスト」または仮定の下で分析できます。

各ノードが接続された引数に公平かつ正確に影響を伝播するように、関連する引数のベイジアンネットワークを構築する必要があります。接続されたノードのチェーンの確率を同時に計算できる必要があります。各ノードには、結果を取得するためにブロックする必要のあるデータストアルックアップが必要です。プロセスはほとんどI/Oバウンドであり、データストア接続はjava、go、python{googleappengine}で非同期に実行できます。各ルックアップが完了すると、確率デルタが無関係のしきい値{現在は0.1%}を下回るまで、接続されている他のすべてのノードに効果が伝播されます。プロセスの各ノードは、接続のチェーンを計算してから、すべてのクエリのすべての結果を合計して有効性の結果を調整する必要があります。結果は、接続された引数にチェーンされます。

無限に繰り返されるのを避けるために、私はゴルーチンでA *のようなプロセスを使用して、引数マップに更新を伝播することを考えていました。複利に基づくヒューリスティックは、影響の確率が0.1%を下回ると、ノードを無視します。SQLトリガーを使用して計算を設定しようとしましたが、複雑で面倒な方法が速すぎました。次に、非同期のnosqlを利用するためにGoogle AppEngineに移行しました。それは優れていましたが、それでも遅すぎました。迅速なUIを取得するために十分な速度で更新を実行する必要があるため、ユーザーが証明または反証を作成または賛成または反対すると、UIに反映された結果をすぐに確認できます。

Goは、必要な並行性をサポートするために選択する言語だと思いますが、私は提案を受け入れています。クライアントは、XHRとWebSocketを使用して引数マップ{およびその更新}をリアルタイムでプッシュおよびプルするモノリシックJavaScriptアプリです。私は10〜15秒で大きなチェーンを計算できるJavaプロトタイプを持っていますが、パフォーマンスの監視は、私のランタイムのほとんどがConcurrentHashMapからの同期とオーバーヘッドで浪費されていることを示しています。

試してみる価値のある他の非常に並行性の高い言語がある場合は、私に知らせてください。私はjava、python、go、ruby、scalaを知っていますが、自分のニーズに合っていれば、どの言語でも学習できます。

同様に、巨大なベイジアンネットワークのオープンソース実装がある場合は、提案を残してください。

4

1 に答える 1

4

ご質問の内容を伝えるのは少し難しいと思います。多分あなたはあなたの質問を詳しく説明することができます.

ゴルーチンは非常に安価であり、XHR や Websocket を多用する最新の Web アプリケーション (およびデータベースの応答などを待たなければならないその他の I/O バウンド アプリケーション) に最適です。さらに、go ランタイムはこれらの goroutine を並行して実行することもできるため、Go は複数のコアとネイティブ コンパイル言語の速度を利用する必要がある CPU バインド タスクにも適しています。

ただし、ゴルーチンとチャネルは無料ではないことにも注意してください。それでもある程度のメモリが必要であり、各同期ポイント (チャネルの送受信など) にはコストがかかります。同期は、たとえばデータベースクエリと比較して非常に安価であるため、通常は問題ありませんが、効率的なベイジアンネットワークの構築には適していない可能性があります。特に、各ゴルーチン/ノードの実際の作業が、同期オーバーヘッド。

すべての並行プログラムの主な目標は、可能な限り共有可変性を回避することです。そのため、ゴルーチンとチャネルでモデル化されたベイジアン ネットワークは、教育的な良い例であり、Go のチャネル実装のパフォーマンスを測定する優れた方法かもしれませんが、おそらく問題には最適ではありません。

于 2012-05-10T13:21:10.767 に答える