好的,这是我今天一直在考虑的问题(如果我事先没有得到答案,我将在下周测试。)
我有许多Erlang进程需要在它们之间传递大型二进制文件。我一直在做的是使用gproc:send来定位并将二进制文件发送到适当的进程。但是,我不是只发送一个二进制文件,我通常发送一个元组,如“{self(),atom,Msg \ binary}”。起初我认为这足以满足大型二进制文件的消息处理要求,以避免内存复制操作。
复制Erlang进程之间的消息中的所有数据,同一个Erlang节点上的> refc二进制文件除外。
然而,现在,我开始怀疑,如果消息处理器/编译器/等会理解那里有一个> 64k二进制文件?或者它会看到元组,只是想想,让我们将整个事情复制到另一个过程中?就像我表示的那样,我计划下周进行测试以查看,我很乐意根据我的发现更新帖子。
我正在使用R16B03-1。
谢谢!
答案 0 :(得分:7)
大小或等于64字节的二进制文件存储在共享区域中并被引用计数,因此它们不会在进程之间复制;只复制对它们的引用。
答案 1 :(得分:0)
元组实际上并不包含它们的元素,而是指向它们的指针。因此,当元组是时,元组内的每个值也会被复制。 Big(> 64)和小二进制文件在下面有不同的类型,即使对于用户来说它们看起来很相似。 Therfore VM可以使用不同的复制操作。