如何估计Scala程序可以处理的actor数量?
对于上下文,我正在考虑什么本质上是一个神经网络,它将以高速率创建和遗忘细胞。我正在考虑让每个细胞成为一个演员,但会有数百万个。我正在试图决定这种设计是否值得追求,但无法估计演员人数的限制。我的意图是它应该完全在一个系统上运行,因此分布式限制不适用。
就此而言,我还没有确定Scala,如果有更好的选择,但是做的单元格具有状态,例如,它们与其他单元格的连接,权重连接等。虽然这可以做为“每个单元格是最终的。更改意味着用一个带有相同ID的新单元替换当前单元格。”
P.S。:我不知道斯卡拉。我正在考虑接受它来做这个项目。我也在考虑许多其他选择,包括Java,Object Pascal和Ada。但是演员似乎是一个比我所追求的更好的地图而不是线程池(并且Java无法处理足够的线程以使线程/单元设计可行。
P.S。:在任何时候,大多数演员都会处于静止状态,但是需要在整个系列中循环。如果语言中没有内置语言,则可以通过每个单元格中的第一个/下一个链接进行管理。 (需要两个链接,以允许中间的单元格被提取以便释放。)
答案 0 :(得分:2)
通过神经网络模拟,真正的问题是计算工作将花费多少时间进行通信,以及计算单元内计算内容的费用是多少?如果大多数努力都在沟通中,那么演员可能是正确性的一个很好的选择,但对于效率来说根本不是一个好的选择(即使对于表现相当不错的Akka来说也是如此; AsyncFP可能会做到这一点)。数以百万计的神经元听起来很慢 - 效率可能是一个重要问题。如果神经元有一些非常重要的计算来做自己,那么通信开销就没什么大不了的了。
如果通信是瓶颈,并且你有很多微小的消息,那么你应该设计一个自定义数据结构来保存网络,还有自定义线程处理,它将利用你拥有的所有处理器并最小化数量锁定你必须做的。例如,如果你有空间,每个神经元可以保存链接到它的那些神经元的输入值数组,并且在计算它的输出时只需直接读取该数组没有锁定和输入神经元只会在没有锁定的情况下更新值。然后,您可以将所有神经元转储到一个大池中,然后让一个主人将它们分成几块,我不知道,一次可能是一万个,每个都是自己的线程。 Scala可以很好地处理这类事情,但是希望自己做很多低级别的工作,或者等待很长时间才能完成模拟。