1. 程式人生 > >第19章 用ETS和DETS儲存資料

第19章 用ETS和DETS儲存資料

可以用來搞笑儲存海量的Erlang資料,提供大型的鍵值查詢表,ETS常駐記憶體,DETS則常駐磁碟,ETS表查詢速度更快,而DETS執行時佔用的記憶體更小

1.表的型別

  • 儲存的是元組,元組裡的某一個元素(預設是第一個)被稱為該表的鍵.通過鍵可以向表裡插入和提取元組.分為連個基本的表型別:異鍵表(set)和同鍵表(bag);基本表型別有有四種表型別:異鍵,有序異鍵,同鍵,副本同鍵

2.四種基本操作

  • 1)建立一個新表或開啟現有的表: 用ets:new或dets:open_file實現
  • 2)向表裡插入一個或多個元組: insert(TableId,X),其中X是一個元組或元組列表
  • 3)在表裡查詢某個元組: lookup(TableId,Key) ,得到的結果是一個匹配key的元組列表
  • 4)丟棄某個表: dets:close(TableId) 或 ets:delete(TableId).

3.建立一個ETS表

  • 1)ets:new(Name,[Opt]) -> TableId : Name是一個原子,[Opt]是一列選項分為:
    • set|ordered_set|bag|duplicate_bag : 建立一個指定型別的ETS表
    • private 建立一個私有表,只有主管程序才能讀取和寫入它
    • public 建立一個公共表,任何知道此表識別符號的程序都能讀取和寫入它
    • protected 建立一個受保護表,任何知道此表識別符號的程序都能讀取它,但只有主管程序才能寫入它
    • named_table 如果設定了此選項,Name就可以被用於後續的表操作
    • {keypos,K} 用K作為鍵的位置,通常鍵的位置是1。基本上唯一需要使用這個選項的場合是儲存Erlang記錄(它其實是元組的另一種形式),並且記錄的第一個元素包含記錄名的時候。
  • 2)建表示例:ets_test.erl
    -module(ets_test).
    -export([start/0]).
    
    start()->
        lists:foreach(fun test_ets/1,[set,ordered_set,bag,duplicate_bag]).
    test_ets(Mode)->
        TableId=ets:new(test,[Mode]),
        ets:insert(TableId,{a,1}),
        ets:insert(TableId,{b,2}),
        ets:insert(TableId,{a,1}),
        ets:insert(TableId,{a,3}),
        List=ets:tab2list(TableId),
        io:format("~-13w => ~p~n",[Mode,List]),
        ets:delete(TableId).
    
    
    1>ets_test:start().
    set           => [{b,2},{a,3}]
    ordered_set   => [{a,3},{b,2}]
    bag           => [{b,2},{a,1},{a,3}]
    duplicate_bag => [{b,2},{a,1},{a,1},{a,3}]