2015-09-22 2 views
2

Я знаю, что ETS имеет ограниченный параллелизм, например, две записи в одну строку одновременно не будут сталкиваться. Но я не могу найти такую ​​информацию для DETS. Кто-нибудь знает?DETS параллелизм? (Erlang)

Обратите внимание, что я не спрашиваю о запуске DETS под эгидой Mnesia, и я не спрашиваю о какой-либо конкретной схеме - скажем, назначая один процесс на строку таблицы DETS. Я просто хочу знать, каковы ограниченные возможности параллельного управления DETS, если таковые имеются.

Спасибо.

+0

Я просто избежать дец из-за своих ограничений по размеру и тенденции к коррумпированной –

+0

Я хотел бы избежать, но из-за требований к производительности, Mnesia операций и блокировка не собирается сокращать его, так что я план очертить дерьмо из него для решения проблемы ограничения размера. – user3355020

ответ

1

Насколько я могу судить, DETS в настоящее время не поддерживает параллелизм.

Из dets manual (моих основных моментов):

Стоит отметить, что тип ordered_set присутствует в Ets пока еще не осуществляется дцем, ни является ограниченной поддержкой одновременных обновлений, что делает последовательность первого и последующих вызовов, безопасных для использования на фиксированных таблицах Ets. Обе эти функции будут реализованы в Dets в будущей версии Erlang/OTP. До тех пор, приложение Mnesia (или , определенный пользователем для блокировки) должно использоваться для реализации безопасного параллелизма. В настоящее время ни одна библиотека Erlang/OTP не поддерживает заказную память на основе диска.

+0

Спасибо - я видел это в документах ранее, однако это неясно и, похоже, говорит о каких-либо упорядоченных наборах, или о применении первого и следующего. Для этого конкретного приложения мне не нужен упорядоченный набор или первый/следующий, мне просто нужно, чтобы несколько процессов добавляли новые записи одновременно. Я выполнил тест, в котором 100 процессов записывают новую запись одновременно, и это сработало, однако я хотел бы знать, имеет ли значение ГАРАНТИРОВАННОЕ для работы – user3355020

+0

Хорошая точка. Просто попробовав это, кажется, что открытие таблицы DETS порождает дочерний процесс в 'dets_sup' в ядре. Однако запись в таблицу не меняет этот процесс вообще. Это заставляет меня думать, что записи делаются непосредственно в файле. Я не уверен, но я думаю, что запись в файл «потокобезопасна» в Erlang (без документации тоже, конечно). Заказ может быть не гарантирован, но каждая запись должна выполняться атомарно. –

+0

В общем, я думаю, что существует очень мало (если вообще есть) стандартных библиотек, которые не являются «потокобезопасными», из-за того, как работает Erlang. Конечно, блокировка и согласованность - это другой вопрос. –