Будет ли dets выполнять чтение с диска при поиске с параметром ram_file?

Опция ram_file описано в документации на DETS Erlang

open_file(name, args)

{ram_file, boolean()}- Будет ли таблица храниться в ОЗУ. Хранение таблицы в ОЗУ может показаться аномалией, но может повысить производительность приложений, которые открывают таблицу, вставляют набор объектов и затем закрывают таблицу. Когда таблица закрывается, ее содержимое записывается в файл на диске. По умолчаниюfalse.

это выполнит сохранение на диске после вставки или обновления

Что, если я воспользуюсь открытием, затем поиском и закрытием?

1 ответ

Решение

Я не проверял документы, но предполагаю, что это означает, что виртуальная машина откроет файл и, возможно,mmapэто, поэтому он постоянно хранится в памяти и будет синхронизироваться с файлом на диске, но я думаю, что изменение все еще может закончиться в кеше, поэтому его нельзя сразу записать на диск. Если вы хотите быть уверены, что все изменения были сброшены на диск, используйте dets:sync/1 вызвать таблицу, чтобы принудительно сбросить данные, что явно указано в документации:

Это также относится к таблицам, которые были открыты с флагом ram_file установлен в true. В этом случае содержимое файла RAM сбрасывается на диск.

Он не будет открывать и закрывать файл после каждого поиска, но будет держать его открытым до тех пор, пока dets:close/1не будет вызываться по данной таблице. С другой стороны, открытие и закрытие таблицы для каждого поиска может быть дорогостоящим, поэтому использование DETS будет немного бессмысленным.

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