2014-05-29 2 views
2

У меня возникли проблемы с размером файла dets.Почему dets file_size не уменьшает после удаления всех ключей

> {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"}] 

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

ответ

1

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

+0

Thanks @RichardC – SameeR

0

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

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

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

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

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

Это работает для меня.

Смежные вопросы