erlang gen_server с большим состоянием - PullRequest
5 голосов
/ 27 февраля 2011

У меня есть три (реализовано с помощью кортежей и списков) с несколькими тысячами записей, и я хотел бы поддерживать одновременное чтение. Объем памяти данных находится в диапазоне 10-20 МБ. Три строится один раз и только после этого читается.

Каков рекомендуемый способ поддержания состояния и предоставления клиентам одновременного доступа?

Вот что я пробовал:

1) Создан сервер gen_server с три в качестве состояния. Это работало нормально, но, очевидно, все вызовы были сериализованы.

2) Модифицировано (1), чтобы порождать новый процесс для каждого вызова, который принимает состояние, запрос и From. Каждый новый процесс проходил через дерево и вызывал gen_server:reply/2 с результатом. Это решение, похоже, не сработало, потому что использование памяти и процессора возросло. Я предполагаю, что это произошло, потому что состояние было скопировано в порожденный процесс для каждого вызова.

Ответы [ 3 ]

5 голосов
/ 27 февраля 2011

mochiglobal от mochiweb разработан именно для такого случая использования.По сути, он возьмет вашу структуру данных и скомпилирует ее в модуль, чтобы данные были общими (нулевая копия для констант модуля).Хорошо работает только со структурами данных, которые не часто меняются, но, похоже, это то, что вы имеете.

3 голосов
/ 27 февраля 2011

если ваше состояние меняется, часто используйте вашу модель / структуру вместо ETS.

Вы можете создать таблицу ETS с одновременными параметрами чтения / записи, которые повысят производительность.

0 голосов
/ 11 января 2013

Другой подход заключается в создании пула gen_servers (с контролем), а затем в распределении входящих подключений к серверу в пуле. Это устраняет узкое место gen_server, связанное с вашим первым подходом. Этот подход также позволяет некоторую настройку, регулируя количество процессов в пуле. LearnYouSomeErlang имеет главу по этому вопросу.

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