第19章 用ETS和DETS儲存資料
阿新 • • 發佈:2018-12-16
可以用來搞笑儲存海量的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}]