erlang学习:用ETS和DETS存储数据3,保存元组到磁盘
学习内容
ETS表把元组保存在内存里,而DETS提供了把Erlang元组保存到磁盘上的方法。DETS的最大文件大小是2GB。DETS文件必须先打开才能使用,用完后还应该正确关闭。如果没有正确关闭,它们就会在下次打开时自动进行修复。因为修复可能会花很长一段时间,所以先正确关闭它们再结束程序是很重要的。
DETS表有着和ETS表不同的共享属性。DETS表在打开时必须赋予一个全局名称。如果两个或更多本地进程用相同的名称和选项打开某个DETS表,它们就会共享这个表。这个表会一直处于打开状态,直到所有进程都关闭它(或者崩溃)。
-module(lib_filenames_dets).
-export([open/1, close/0, filename2index/1, index2filename/1]).
open(File) ->
io:format ("detsopened:~p~n",[File]),
Bool = filelib:is_file(File),
case dets:open_file(?MODULE,[{file, File}]) of
{ok, ?MODULE} ->
case Bool of
true -> void;
false -> ok = dets:insert(?MODULE, {free, 1}) %%创建新表时插入一个元组
end,
true;
{error, Reason} ->
io:format("cannot open dets table-n" ),
exit({eDetsopen, File, Reason})
end.
close() -> dets:close(?MODULE).
filename2index(FileName) when is_binary(FileName) ->
io:format("filename2index:~p~n", [FileName]),
case dets:lookup(?MODULE, FileName) of
[] ->
[{_, Free}] = dets:lookup(?MODULE, free),
ok = dets:insert(?MODULE, [{Free, FileName}, {FileName, Free}, {free, Free+1}]),
Free;
[{_, N}] ->
N
end.
测试结果
能够正常创建file文件夹,但是在调用后面插入函数时总是出现错误
原因时在出现错误后文件夹就自动关闭了,需要重新开启文件夹才能读取其中的数据