删除所有密钥后,为什么文件大小不会减少

时间:2014-05-29 10:11:44

标签: erlang dets

我遇到了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"}]

我无法理解我还需要做什么以及删除操作以减少file_size。 问题是,因为dets file_size限制为4gb,即使删除了对象,我也达到了dets文件的大小限制。

2 个答案:

答案 0 :(得分:1)

当删除条目时,dets实现不会尝试缩小文件,除非您执行delete_all_objects。要手动收缩文件,您必须创建一个新的临时dets文件,将所有条目复制到新文件,删除旧文件,并重命名临时文件以替换旧文件。

答案 1 :(得分:0)

还有另一种选择如何减小DETS表的大小(删除后)。

关闭此DETS表(dets:close)并使用{repair,force}选项打开它。

请参阅文档:http://www.erlang.org/doc/man/dets.htm

  

对表进行碎片整理的唯一方法是关闭它然后打开它   再次将修复选项设置为强制。

当没有其他进程打开此文件时,该文件将被压缩。

它对我有用。