2012-05-10 32 views
7

我有一個大型的哲學參數數據集,每個數據集都連接到其他參數,作爲給定語句的證明或反證。根語句可以有許多證明和反駁,每個證據也可以有證據和反駁。語句也可以在多個圖中使用,並且可以在「給定上下文」或假設下分析圖。我需要構造一個相關參數的貝葉斯網絡,以便每個節點都公平,準確地傳播影響它的連接參數;我需要能夠同時計算連接節點鏈的概率,每個節點都需要數據存儲區查找,必須阻止獲取結果;該進程主要是I/O綁定的,並且我的數據存儲連接可以在java,go和python {google appengine}中異步運行。一旦每次查找完成,它就會將效果傳播到所有其他連接的節點,直到概率增量降到低於無關閾值(當前爲0.1%)。流程的每個節點必須計算連接鏈,然後總結所有查詢中的所有結果以調整有效性結果,並將結果鏈接到任何連接的參數外部。使用Google Go的Goroutines創建貝葉斯網絡

爲了避免無限循環,我正在考慮在goroutines中使用類似A *的過程來將更新傳播到參數映射,並且基於複合影響的啓發式忽略節點,一旦影響概率下降, 0.1%。我試圖用SQL觸發器來設置計算,但它太複雜而且雜亂。然後我轉移到谷歌appengine利用異步nosql的優勢,這是更好,但仍然太慢。我需要以足夠快的速度運行更新以獲得精彩的用戶界面,所以當用戶創建或投票贊成或反對證明或反對時,他們可以立即看到UI中反映的結果。

我認爲Go是支持我需要的併發的語言,但我願意接受建議。客戶端是一個單一的JavaScript應用程序,它只是使用XHR和websocket實時推送和拉取自變量映射{及其更新}。我有一個Java原型,可以在10〜15s內計算大型連鎖,但對性能的監控表明我的大部分運行時間在ConcurrentHashMap中同步和開銷都是浪費的。

如果還有其他高度並行的語言值得嘗試,請告訴我。我知道java,python,go,ruby和scala,但是如果它適合我​​的需求,它會學習任何語言。

同樣,如果有大型貝葉斯網絡的開源實現,請留下建議。

+0

一個有趣的應用程序,但究竟是什麼問題? – Sonia

+0

具體來說,我想知道是否有任何先例/行業標準用於計算巨大的貝葉斯網絡,以及是否有goroutines像這樣的工作最適合這個工作。 – Ajax

回答

4

我覺得有點難以分辨你在問什麼。也許你可以詳細說明你的問題。

Goroutines非常便宜,並且與現代Web應用程序(使用XHR或Websockets)(以及其他必須等待數據庫響應等I/O綁定應用程序)的應用程序完美匹配。此外,go運行時也能夠並行執行這些goroutine,因此Go也非常適合CPU綁定任務,它應該利用多個內核和本地編譯語言的速度。

但是你也應該記住,goroutines和渠道是不是免費的。它們仍然需要一定量的內存,並且每個同步點(例如,通道發送或接收)都伴隨着其成本。這通常不是問題,因爲與例如數據庫查詢相比,同步非常便宜,但它可能不適合於構建有效的貝葉斯網絡,尤其是如果每個goroutine /節點的實際工作相對於同步開銷。

您的每個併發程序的主要目標應儘可能避免共享可變性。因此,使用goroutines和頻道建模的貝葉斯網絡可能是一個很好的教育示例,也是衡量Go的頻道實現性能的好方法,但它可能不是您的問題的最佳選擇。

+2

...但比SQL觸發器更好,我應該這樣想。 – Sonia

+0

貝葉斯網絡的每個節點的實際工作將需要數據存儲查找,然後進行計算和潛在更多的數據存儲查找,直到傳播概率降至低於不相關閾值(當前爲0.1%)。每個數據存儲查找都需要阻塞,所以計算本身相當便宜,但併發和同步相當昂貴。我有一個異步Java原型,可以在大約10秒內完成,即使多個線程一次運行多個查詢{Java threads = too weightweight},我似乎也無法切割。 – Ajax

+0

我將更新問題以反映該進程主要是I/O限制的事實;我會在執行這個過程中報告任何發現/性能基準。 – Ajax