【问题标题】:Erlang: should I keep dets open and under supervision?Erlang:我应该保持开放和监督吗?
【发布时间】:2013-09-16 01:25:37
【问题描述】:

我正在将数据移入和移出 dets,我有一个选择:我可以:

1) 在访问它之前立即打开它并在之后立即关闭它,或者

%% Based on Armstrong, Programming Erlang, page 279
open() ->
   File = ?NAMEDB,
   case dets:open_file(?MODULE, [{file, File}, {keypos,2}]) of
      {ok, ?MODULE} ->
          io:format("dets opened:~p~n", [File]);
      {error,_Reason} ->
         io:format("cannot open dets table~n"),
         exit(eDetsOpen)
   end.

%% Open db, get record, close db, return name
name(Record) ->
   open(),
   #name{honorific=Honorific, fname=FName, mname=MName, lname=LName, suffix=Suffix} = Record, 
   close(),
   format_name([Honorific, FName, MName, LName, Suffix]).

2) 将 dets 链接到在发生崩溃时重新打开它的主管;例如使用主管通过 gen-server 访问数据,例如:

start_link() ->
   supervisor:start_link({local, ?SERVER}, ?MODULE, []).

start_child(Value, LeaseTime) ->
   supervisor:start_child(?SERVER, [Value, LeaseTime]).

init([]) ->
   Names           = {lit_names, {lit_names, start_link, []},
                     temporary, brutal_kill, worker, [zpt_gridz_scratchpad]},
   Children        = [Names],
   RestartStrategy = {simple_one_for_one, 0, 1},
                     {ok, {RestartStrategy, Children}}.

哪个最好?还是有更好的选择?

非常感谢,

LRP

【问题讨论】:

  • 你的意思是ets(Erlang Term Store)吗?
  • 你有一些代码可以说明你的意思吗?
  • 是的,基于磁盘的 erlang 术语库 (erlang.org/doc/man/dets.html)。我将编辑问题以发布代码。
  • 啊,我想我看到了我的方式的错误。如果我错了,请纠正我,但打开一个 dets 表涉及打开一个文件,而不是启动一个过程。因此,我需要在每次插入或访问之前打开文件;完成后关闭它。
  • 不,马丁,我认为你的问题很恰当。我的查询没有像它可能的那样清楚地表达出来。所以我很感谢你的调查。改写我原来的问题有助于我对这个问题有更清晰的认识。我还有很多东西要学,正是像您这样的人的热心帮助让我相信有一天一切都会变得清晰。

标签: erlang erlang-supervisor dets


【解决方案1】:

我认为这完全取决于您的使用模式。在我看来,您有几个选择:

  1. 打开表,读/写一些东西,关闭表。这可以与 ram_file 选项一起使用,以获得更高的性能,具体取决于您的用例。
  2. 打开表一次,在需要时继续对其进行读写,然后将其关闭。
  3. 在一个进程中打开表,通过这个进程代理所有的读写,然后关闭它。

第二个可能最适合休闲用例。其实several processes can open the same DETS table simultaneously

如果两个进程通过提供相同的名称和参数打开同一个表,则该表将有两个用户。如果一个用户关闭表,它仍然保持打开状态,直到第二个用户关闭表。

第三种情况可能是最慢的,不应该选择,除非你真的有充分的理由(数据需要按特定顺序写入或针对其他数据进行原子验证)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-29
    • 2016-02-12
    • 2011-05-24
    • 2011-08-07
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多