Параллелизм DETS? (Эрланг)

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

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

Спасибо.


person user3355020    schedule 22.09.2015    source источник
comment
Я бы просто избегал DETS из-за его ограничений по размеру и склонности к повреждению.   -  person Peer Stritzinger    schedule 22.09.2015
comment
Я бы хотел этого избежать, но из-за требований к производительности, mnesia-транзакции и блокировка не помогут, поэтому у меня есть план избавиться от этого дерьма, чтобы решить проблему ограничения размера.   -  person user3355020    schedule 23.09.2015


Ответы (1)


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

Из dets руководства (мои основные моменты):

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

person Adam Lindberg    schedule 22.09.2015
comment
Спасибо - я видел это в документах ранее, однако это неясно и, кажется, что речь идет либо об упорядоченных наборах, либо об использовании первого и следующего. Для этого конкретного приложения мне не нужен упорядоченный набор или первый/следующий, мне просто нужна возможность нескольких процессов одновременно добавлять новые записи. Я провел тест, в котором 100 процессов одновременно записывают новую запись, и это сработало, однако я хотел бы знать, ГАРАНТИРОВАННО ли это работает. - person user3355020; 23.09.2015
comment
Хорошая точка зрения. Просто попробовав, кажется, что открытие таблицы DETS порождает дочерний процесс под dets_sup в ядре. Однако запись в таблицу никак не меняет этот процесс. Это наводит меня на мысль, что запись выполняется непосредственно в файл. Я не уверен, но я думаю, что запись в файл является потокобезопасной в Erlang (конечно, там тоже нет документации). Порядок может быть не гарантирован, но каждая запись должна выполняться атомарно. - person Adam Lindberg; 23.09.2015
comment
В общем, я думаю, что очень мало (если вообще есть) стандартных библиотек, которые не являются потокобезопасными, из-за того, как работает Erlang. Конечно, блокировка и согласованность — это другое дело. - person Adam Lindberg; 23.09.2015