Почему dets file_size не уменьшается после удаления всех ключей

У меня проблемы с размером файла dets.

> {ok,D1} = dets:open_file(sample_dets_file, [{type, set},{auto_save,3}]).
{ok,sample_dets_file}

> [dets:insert(D1,{{fid,X},"this is sample data"}) || X <- lists:seq(1,10000)].
> dets:info(D1).

[{type,set},
 {keypos,1},
 {size,10000},
 {file_size,769748},
 {filename,"sample_dets_file"}]

> [dets:delete(D1,{fid,X}) || X <- lists:seq(1,10000)].
> dets:info(D1).

[{type,set},
 {keypos,1},
 {size,0},
 {file_size,770092},
 {filename,"sample_dets_file"}]

После вставки - {size,10000}, {file_size,769748}
После удаления {size,0}, {file_size,770092},
Размер файла не уменьшился даже после того, как таблица пуста. Однако, когда я выполняю delete_all_objectsразмер файла возвращается к нормальному.

> dets:delete_all_objects(D1).
> dets:info(D1).

 [{type,set},
 {keypos,1},
 {size,0},
 {file_size,5464},
 {filename,"sample_dets_file"}]

Я не мог понять, что дополнительно мне нужно сделать вместе с операцией удаления, чтобы уменьшить размер файла. Проблема в том, что размер файла dets file_size ограничен 4 ГБ, даже если объекты удаляются, я достигаю предела размера файла dets.

2 ответа

Решение

Реализация dets не пытается сжать файл при удалении записей, кроме случаев, когда вы делаете delete_all_objects. Чтобы уменьшить файл вручную, необходимо создать новый временный файл dets, скопировать все записи в новый файл, удалить старый файл и переименовать временный файл, чтобы заменить старый.

Есть еще один способ уменьшить размер таблицы DETS (после удаления).

Закройте эту таблицу DETS (dets:close) и откройте ее с помощью опции {repair, force}.

Смотрите документацию: http://www.erlang.org/doc/man/dets.htm

Единственный способ дефрагментировать таблицу - закрыть ее, а затем снова открыть, установив для параметра восстановления значение force.

Когда нет другого процесса, который открыл этот файл, файл уплотняется.

Меня устраивает.

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