2011-03-22 69 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