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文件夹,但是在调用后面插入函数时总是出现错误
请添加图片描述
原因时在出现错误后文件夹就自动关闭了,需要重新开启文件夹才能读取其中的数据
请添加图片描述

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值