В основном только для чтения использование DETS

Так что я использую ETS - прекрасно работает. Тем не менее, я использую его как кэш данных маршрута - который я загружаю при загрузке модуля и сохраняю при внесении изменений (он читается гораздо больше, чем записывается).

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

3 ответа

Решение

DETS в большинстве случаев намного медленнее, чем ETS, но я предполагаю, что если ваш размер данных невелик, то больше всего, если он будет кешироваться дисковым кешем и будет быстрее извлекать данные при втором чтении, поэтому лучше всего попробуйте с вашим типом использования

Но вы рассматривали возможность использования Mnesia вместо ETS напрямую? С таблицей Mnesia типа disc_copies вы получите скорость ETS и постоянство

Прямо из справочной страницы Dets:

"Поскольку все операции, выполняемые Dets, являются операциями с дисками, важно понимать, что одна операция поиска включает в себя ряд операций поиска и чтения диска. По этой причине функции Dets намного медленнее, чем соответствующие функции Ets, хотя Dets экспортирует аналогичный интерфейс."

То есть, для хранения в основном для чтения, Dets не является оптимальным выбором.

(Должен признать, я нахожу это решение по дизайну странным - лучшая реализация должна кэшировать недавние поиски. Однако, поскольку Ets и Dets являются базовыми средствами в Erlang, я думаю, что разработчики оставили эту оптимизацию для пользователей.)

Если вы пишете редко, прочитайте много данных, которые вы хорошо храните в памяти, посмотрите "Mochiglobal". У Mochiweb есть аккуратный модуль, который использует общую кучу Эрланга для констант модулей через систему управления кодом, чтобы обеспечить сверхбыстрый доступ к терминам, генерируя модули с заданными значениями в качестве констант на лету.

Риак использует Mochiglobal для состояния кольца, IIRC.

Ее источник:

https://github.com/mochi/mochiweb/blob/master/src/mochiglobal.erl

Конечно, здесь нет абсолютно никакой настойчивости, но если вы хотите сильно оптимизировать чтение, вы не сможете стать намного лучше, чем это.

Другие вопросы по тегам