2012-05-10 12 views
7

私は哲学的な議論の大きなデータセットを持っていますが、それぞれが他の議論に、特定のステートメントの証明または反証として接続します。ルートステートメントは多くの証明と反駁を持つことができ、それぞれの証明と反駁もあります。ステートメントは複数のグラフでも使用でき、グラフは「特定のコンテキスト」または仮定の下で分析できます。Google Goのゴルーチンを使用してベイズネットワークを作成する

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

私はゴルーチンでA *様のプロセスを使用して、引数マップに更新を伝播させ、影響の確率が一度低下するとノードを無視する複合的な影響に基づいたヒューリスティックを考えていました。 0.1%であった。私はSQLトリガで計算をセットアップしようとしましたが、複雑で面倒な方法が速すぎます。それから、私は非同期のnosqlを利用するためにGoogleのappengineに移りました。それは優れていましたが、まだ遅すぎました。私は、急なUIを取得するのに十分な速さでアップデートを実行する必要があるため、ユーザーが証明書または反駁に対して作成または投票したり、UIに反映された結果をすぐに見ることができます。

私は、必要な同時実行性をサポートするために、Goが選択した言語だと思いますが、私は提案を公開しています。クライアントは、引数マップ{とその更新情報}をリアルタイムでプッシュ/プルするためにXHRとウェブソケットを使用するモノリシックなjavascriptアプリケーションです。私は、10〜15秒で大きなチェーンを計算できるJavaプロトタイプを持っていますが、パフォーマンスの監視は、ほとんどのランタイムがConcurrentHashMapの同期とオーバーヘッドで無駄になっていることを示しています。

試してみる価値のある他の並行言語がある場合は、教えてください。私はjava、python、go、ruby、scalaを知っていますが、私のニーズに合っていれば言語を学ぶでしょう。

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

+0

興味深いアプリケーションですが、正確にはあなたの質問は何ですか? – Sonia

+0

まあ、具体的には、巨大なベイジアンネットワークを計算するための先例/業界の基準があるかどうか、そしてゴルーチンがこの仕事に最適に適合しているかどうかを知りたいと思っています。 – Ajax

答えて

4

あなたが尋ねていることを伝えるのはちょっと難しいと思います。たぶん、あなたはあなたの質問に精通することができます。

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

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

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

+2

...しかし、SQLトリガよりも優れていると思います。 – Sonia

+0

ベイジアンネットワークの各ノードの実際の作業には、伝播確率が無関係の{0.1%現在のしきい値を下回るまで、データストアルックアップとそれに続く計算およびデータストアのルックアップが必要になります。各データストアのルックアップにはブロッキングが必要なため、計算自体はかなり安いですが、並行性と同期性はかなり高価です。私は約10秒で完了することができる非同期のJavaプロトタイプを持っている、私は一度に複数のクエリを実行している複数のスレッドでも{Javaスレッド=あまりにも重量}をカットすることはできません。 – Ajax

+0

私はプロセスがほとんどI/Oバウンドであるという事実を反映するために質問を更新します。これを実装し、結果/パフォーマンスベンチマークを報告します。 – Ajax

関連する問題