我有一个很大的哲学论证数据集,每个论证都与其他论证联系起来,作为对给定陈述的证明或反证。一个根语句可以有很多证明和证明,其中每一个也可以有证明和证明。语句也可以用于多个图形中,并且可以在“给定的上下文”或假设下分析图形。
我需要构造一个由相关参数组成的贝叶斯网络,以便每个节点都能公平,准确地将影响传播给它所连接的参数。我需要能够同时计算连接的节点链的概率,每个节点都需要数据存储区查询,而这些数据存储区查询必须阻塞才能获得结果。该过程主要受I/O约束,并且我的数据存储区连接可以在java,go和python {google appengine}中异步运行。每次查找完成后,它将影响传播到所有其他连接的节点,直到概率增量降至不相关阈值以下(当前为0.1%)。流程的每个节点必须计算连接链,然后将所有查询中的所有结果求和以调整有效性结果,并将结果向外链接到任何连接的参数。
为了避免无限重复发生,我正在考虑在goroutine中使用类似A *的过程将更新传播到参数图,并采用基于混合影响的启发式算法,一旦影响概率降至0.1%以下,该启发式将忽略节点。我曾尝试使用SQL触发器来设置计算,但是它变得过于复杂和困惑。然后我搬到google appengine来利用异步nosql,它虽然更好,但仍然太慢。我需要以足够快的速度运行更新,以得到一个活泼的UI,因此,当用户创建或投票支持或反对证明或反证时,他们可以立即看到反射(reflect)在UI中的结果。
我认为Go是支持我需要的并发的首选语言,但是我愿意接受建议。客户端是一个整体式javascript应用程序,仅使用XHR和websocket实时推送和拉取参数映射{及其更新}。我有一个Java原型(prototype),可以在10到15秒内计算大型链,但是对性能的监视显示,我的大部分运行时都浪费在ConcurrentHashMap的同步和开销上。
如果还有其他值得尝试的并发语言,请告诉我。我知道java,python,go,ruby和scala,但是会在适合我的情况下学习任何语言。
同样,如果有大型贝叶斯网络的开源实现,请提出建议。
最佳答案
我认为要说出您要问的内容有点困难。也许您可以详细说明您的问题。
Goroutines相当便宜,并且是大量使用XHR或Websockets的现代Web应用程序(以及其他必须等待数据库响应之类的受I/O约束的应用程序)的完美匹配。此外,go运行时还能够并行执行这些goroutine,因此Go也非常适合CPU绑定(bind)的任务,这些任务应利用多个内核和 native 编译语言的速度。
但是您还应该记住,goroutines和 channel 不是免费的。它们仍然需要一定数量的内存,并且每个同步点(例如, channel 发送或接收)都需要付出一定的代价。通常,这不是问题,因为与数据库查询相比,同步非常便宜,但它可能不适合构建高效的贝叶斯网络,尤其是如果每个goroutine/节点的实际工作与同步开销。
每个并发程序的主要目标应该是尽可能避免共享的可变性。因此,用goroutine和 channel 建模的贝叶斯网络可能是一个很好的教学示例,也是衡量Go channel 实现性能的好方法,但它可能并不是最适合您的问题。
关于google-app-engine - 使用Google Go的Goroutines创建贝叶斯网络,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10529365/