erlang - отправка большого сообщения производительности - PullRequest
3 голосов
/ 22 марта 2011

предположим, я создаю новый локальный процесс в приложении 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 представляет собой структурированный контент, а именно: карту, на которой я могу выполнять некоторые операции.

ДОБАВЛЕНО2
Хорошо, я вижу, что нет такого решения для Erlang (разделение некоторых структурированных данных, таких как map в рабочем процессе) - из-за дизайна Erlang. Но я думаю, что это оправдано солидной работой и легким совпадением управления.

Ответы [ 2 ]

6 голосов
/ 22 марта 2011

Из Руководства по эффективности Erlang :

Все данные в сообщениях между процессами Erlang копируются, за исключением двоичных файлов refc на том же Erlangузел.

Да, вам следует избегать отправки больших терминов между процессами.Если вам нужно отправить много данных, отправьте их в двоичном виде.

4 голосов
/ 22 марта 2011

В качестве рекомендации вы можете отправить только pid текущего процесса (self ()) процессу, который вы хотите обработать с помощью 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).

(извините за возможные синтаксические ошибки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...