使用Google Go的Goroutines创建贝叶斯网络

时间:2012-05-10 07:34:09

标签: google-app-engine go a-star bayesian bayesian-networks

我有一个庞大的哲学参数数据集,每个参数都连接到其他参数作为给定语句的证明或反证。根声明可以有许多证明和反证,每个都可能有证明和反证。语句也可以用在多个图形中,图形可以在“给定的上下文”或假设下进行分析。

我需要构建一个相关参数的贝叶斯网络,以便每个节点公平准确地传播影响它的连接参数;我需要能够同时计算连接节点链的概率,每个节点都需要数据存储区查找,必须阻止才能获得结果;该进程主要是I / O绑定,我的数据存储连接可以在java,go和python {google appengine}中异步运行。每次查找完成后,它会将效果传播到所有其他连接节点,直到概率增量低于不相关阈值{当前为0.1%}。流程的每个节点都必须计算连接链,然后将所有查询中的所有结果相加以调整有效性结果,并将结果链接到任何连接的参数。

为了避免无限重复,我想在goroutines中使用类似A *的过程将更新传播到参数映射,使用基于复合影响的启发式方法,一旦影响的概率低于0.1,就会忽略节点,例如0.1 %。我试图用SQL触发器设置计算,但它太复杂而且杂乱得太快。然后我转移到谷歌appengine利用异步nosql,它更好,但仍然太慢。我需要足够快地运行更新以获得快速的UI,因此当用户创建或投票支持或反对证明或反证时,他们可以立即看到结果反映在UI中。

我认为Go是支持我需要的并发性的首选语言,但我愿意接受建议。客户端是一个单片的javascript应用程序,它只使用XHR和websockets实时推送和拉出参数映射{及其更新}。我有一个可以在10到15秒内计算大型链的java原型,但是对性能的监控表明我的大部分运行时都浪费在ConcurrentHashMap的同步和开销上。

如果还有其他高度并发的语言值得尝试,请告知我们。我知道java,python,go,ruby和scala,但如果它符合我的需要,它会学习任何语言。

同样,如果有大型贝叶斯网络的开源实现,请留下建议。

1 个答案:

答案 0 :(得分:4)

我认为要告诉你的问题有点困难。也许你可以详细说明你的问题。

Goroutines相当便宜,并且非常适合使用XHR或Websockets的现代Web应用程序(以及其他必须等待数据库响应和类似内容的I / O绑定应用程序)。此外,go运行时还能够并行执行这些goroutine,因此Go也非常适合CPU绑定任务,这应该利用多个内核和本机编译语言的速度。

但你也应该记住,goroutines和频道不是免费的。它们仍然需要一定量的存储器,并且每个同步点(例如,信道发送或接收)都带有其成本。这通常不是问题,因为与数据库查询相比,同步非常便宜,但它可能不适合构建有效的贝叶斯网络,特别是如果每​​个goroutine /节点的实际工作与之相比可忽略不计。同步开销。

每个并发程序的主要目标应该是尽可能避免共享的可变性。因此,使用goroutines和channel建模的贝叶斯网络可能是一个很好的教育示例,也是测量Go通道实现性能的好方法,但它可能不是最适合您的问题。