【问题标题】:Erlang Message Passing for Large Binaries, Optimizing Performance Recommendations大型二进制文件的 Erlang 消息传递,优化性能建议
【发布时间】:2015-05-01 22:48:39
【问题描述】:

好的,这就是我今天一直在思考的问题(如果我事先没有得到答案,我会在下周进行测试)。

我有许多 Erlang 进程需要在它们之间传递大型二进制文件。我一直在做的是使用 gproc:send 定位二进制文​​件并将其发送到适当的进程。但是,我不只发送一个二进制文件,我通常发送一个元组,例如“{self(),atom,Msg\binary}”。一开始我以为这样就足以满足大型二进制文件的消息处理要求,避免内存复制操作。

8.2 处理消息

复制 Erlang 进程之间消息中的所有数据,但同一 Erlang 节点上的 refc 二进制文件除外。

发件人:Erlang Efficiency Guide

但是,现在我开始怀疑,消息处理器/编译器/等是否会理解其中存在 >64k 的二进制文件?或者它会看到元组并只是想,让我们将整个事情复制到另一个进程?就像我表示的那样,我确实计划在下周进行测试以查看,我很乐意用我的发现更新帖子。

我正在使用 R16B03-1。

谢谢!

【问题讨论】:

    标签: erlang


    【解决方案1】:

    元组实际上并不包含它们的元素,而是指向它们的指针。因此,当元组存在时,元组中的每个值也会被复制。大 (>64) 和小二进制文件在下面有不同的类型,即使对于用户来说它们看起来很相似。因此 VM 可以使用不同的复制操作。

    【讨论】:

      【解决方案2】:

      大小大于或等于 64 字节的二进制文件存储在共享区域中并进行引用计数,因此它们不会在进程之间复制;只复制对它们的引用。

      【讨论】:

      • 谢谢史蒂夫,所以确认一下,大二进制是否是元组的一部分并不重要?
      • @OldSchool 如果对您有帮助,请接受此答案。
      猜你喜欢
      • 2016-08-29
      • 2011-10-18
      • 2012-07-04
      • 2016-04-30
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      • 2016-04-30
      • 2017-02-22
      相关资源
      最近更新 更多