跨Akka演员共享或访问大型不可变数据

时间:2016-09-01 23:06:57

标签: akka

我正在开发一个在单个不可变数据结构上执行大量数字运算的应用程序。 (一个非常大的数组的集合 - 基本上是一个大矩阵。让我们说一个典型的大小是200列乘100,000行的双倍。)很多计算可以以不同的方式并行化,我想利用Akka演员模型来解决问题。

我担心必须在消息中传递这个矩阵(或部分),因为我认为这将涉及大量的复制和序列化。

我是否过度思考这个问题? (也就是说,如果一个主管演员将这个矩阵的一些数组传递给它的下属,那么Akka运行时是否足够聪明,只能将其作为参考传递 - 假设它们保存在同一个JVM上 - 而不是将所有数据序列化为传递的消息?)

我想问一个更简单的问题是:应该避免在消息中传递大量数据结构的情况吗?

重申一下:这些数据是完全不可改变的。它永远不会改变。

2 个答案:

答案 0 :(得分:2)

如果您发送到remote actor(或者,通过扩展程序,发送到群集节点),Akka将仅序列化邮件。远程并不一定意味着涉及到适当的网络;它可以只是同一台机器上的不同JVM(通过环回接口)。如果在一个JVM上有一个actor系统而没有任何远程处理,那么只传递一个引用,就像你将消息放在一个Queue上并让另一个Thread读取它一样。

答案 1 :(得分:1)

通常,不应将非常大的数据结构传递给远程actor。相反,将您的数据结构上传到某种持久性blob存储(HDFS,S3等),并发送一条消息告诉远程操作员新数据可供处理。