2011-03-22 51 views
4

假设我在一个Erlang应用程序中创建新的本地进程,我想给它一个大消息。二郎 - 发送大消息性能

-module(chain_hello). 

start(N, Some_big_data)->          
    Pid1 = spawn(chain_hello, some_fun, [N]), 
    Pid1 ! Some_big_data, 
    io:format("done \n"). 

尽管Some_big_data是真正的大数据的引用(例如文件的内容。) - 它是在发送时复制?性能有很大的处罚吗?

通常我会使用一些线程安全共享对象(和/或互斥)。 Erlang有没有解决方案可以避免复制邮件内容?

新增:
有趣的情况是,当Some_big_data是结构化的内容 - 要具体:地图,关于这一点我可以执行某些操作。

ADDED2
好的,我看到存在用于二郎没有这样的溶液(剪切等地图在工作进程一些结构化数据) - 由于二郎设计。但我认为这是合理的工作,并容易同意管理。

回答

5

作为一个建议,你可以只发送当前进程(个体经营())的PID,你要处理的是some_big_data的过程。这样,当你想使用some_big_data时,你可以从第二个进程中引用它。

例如:

-module(proc1). 

send_big_data() -> 
    BigData = get_some_big_data(), 
    Pid = spawn(fun proc2:start/0), 
    Pid ! {process_big_data, self()}, 
    loop(Pid, BigData). 

loop(Pid,BigData) -> 
    receive 
    get_first_element -> 
     [H|T] = BigData, 
     Pid ! {response, H}; 
    _ -> 
     Pid ! {nothing} 
    end, 
    loop(Pid). 

(对不起,我最终的语法错误)。

+0

我想这只是“erlangish解决方案”(听起来很安静,但效率不高) - 根据需要通过单独的数据管理器进程调用和复制值。感谢您的回应! – 2011-03-23 12:33:36

6

Erlang Efficiency Guide

中的所有数据的Erlang 进程之间的消息被复制,具有相同 二郎节点上 异常refc binaries

是的,你应该避免进程之间发送大方面。如果您需要发送大量数据,请将其作为二进制文件发送。

+0

是 - 但二进制文件只适用于非结构化内容不错。 – 2011-03-23 12:40:43

+1

那么,当然你可以单独发送结构化数据,但我没有把它看作“大数据”。在我看来,这是很多“小数据”。随着知识条款被复制,人们可以构建程序来实现最少量的复制。但请注意,一次只复制一个小块仍然会以另一种方式复制相同数量的数据(当然这可能会在特定情况下更快)。 – 2011-03-23 12:43:44

+0

是 - 但如果您需要从refc Binary中构建的结构化数据中获益,则需要复制。 除了这个二进制文件是良好的从更大的二进制程序匹配的公共数据(序列,字符串,文件等。) – 2011-03-23 19:08:05