跨Akka参与者共享或访问大型不可变数据

跨Akka参与者共享或访问大型不可变数据,akka,Akka,我正在开发一个应用程序,它在单个不变的数据结构上进行大量的数字运算。(一组非常大的数组——本质上是一个大矩阵。假设一个典型的大小是200列乘以100000行的双精度数组。)很多计算可以以不同的方式并行,我想利用Akka actor模型来解决这个问题 我担心必须在消息中传递此矩阵(或其部分),因为我认为这将涉及大量的复制和序列化 我是不是想得太多了?(也就是说,如果主管参与者将此矩阵的一些数组传递给其下属,Akka运行时是否足够聪明,可以将其作为引用传递(假设它们保持在同一JVM上),而不是将所有

我正在开发一个应用程序,它在单个不变的数据结构上进行大量的数字运算。(一组非常大的数组——本质上是一个大矩阵。假设一个典型的大小是200列乘以100000行的双精度数组。)很多计算可以以不同的方式并行,我想利用Akka actor模型来解决这个问题

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

我是不是想得太多了?(也就是说,如果主管参与者将此矩阵的一些数组传递给其下属,Akka运行时是否足够聪明,可以将其作为引用传递(假设它们保持在同一JVM上),而不是将所有内容序列化为消息进行传递?)

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


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

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

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

通常,非常大的数据结构不应该传递给远程参与者。相反,将您的数据结构上载到某种类型的持久blob存储(HDFS、S3等),并发送一条消息,告诉远程参与者可以处理新数据。

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

谢谢。我想在极端情况下会是这样。但相对的问题是“非常大”意味着什么。在我的应用程序中,我考虑了一个大约10个双精度数组(有时是整数)的集合,每个数组的大小可能在10000到1000万之间。在较小的一端,看起来只有几兆字节,所以我猜这没关系,但我不知道上限应该是多少。重要的是速度是一个关键的架构因素。谢谢。我想在极端情况下会是这样。但相对的问题是“非常大”意味着什么。在我的应用程序中,我考虑了一个大约10个双精度数组(有时是整数)的集合,每个数组的大小可能在10000到1000万之间。在较小的一端,看起来只有几兆字节,所以我猜这没关系,但我不知道上限应该是多少。重要的是速度是一个关键的架构因素。