ETS 常用的操作
一、建表, 删表
建表:TabPid = ets:new(tableName,Options).
删表:ets:delete(Tab).
说明:
-
1、TabPid 是 ets 表的 pid 引用.
-
2、tableName 是ets 表的名称.
-
3、Options 的格式是 [Type | Access | named_table | {keypos, Pos} | {heir, pid(), HeirData} | {heir,none} | Tweaks]. 默认选项是 [set,protected,{keypos,1},{heir,none},{write_concurrency,false},{read_concurrency,false}].
-
(1)Type 为ets表的类型,可以选项是 set | ordered_set | bag | duplicate_bag.
-
(2)Access 为访问权限,可选项是 public | protected | private,其中public 的权限是 [owner,other] = [rw,rw], protected的权限是 [owner,other] = [rw,rn], private 的权限是 [owner,other] = [rw,nn]. (r = read, w =write, n = no).
-
(3)Tweaks 选项是 {write_concurrency,boolean()} | { read_concurrency,boolean()} | compressed , compressed 选项指的是数据将以压缩的方式存储以节省内存,但对于像match, select 操作,ets表的效率会受到很大的影响。
二、添加数据
ets:insert(Tab, Data).
说明:
-
1、Tab 是表的标识,可以是pid引用,也可以是表名(named_table).
-
2、Data 是要添加的数据,格式是 tuple() | [ tuple()], 如果表的类型(Type)是 set | ordered_set, 那么相同的key的数据将被替换。
三、删除数据
-
1、ets:delete(Tab,Key).
说明:
-
2、ets:detete_all_objects(Tab) -> true
说明:
(1)删除表中所有的对象,object = {key,value},该操作是一个原子操作。
-
3、ets:detele_object(Tab,Object) -> true
说明:删除表中的某个对象。
四、查找数据
1、ets:lookup(Tab,Key) -> [Object | Objects].
说明:
在表Tab查找关键字为Key的对象。set | ordered_set 返回一个对象或空,bag | duplicate_bag 可以返回多个对象Objects
五、提取ets表数据
-
1、匹配 match
ets:match(Tab,Pattern) -> [Match].
说明:
(1)Match = [term].
(2)match 把数据从erts拷贝到process中,会遍历整个ets表,当表的数量很大的时候,效率会很低,所以慎用。
-
2、筛选 select
ets:select(Tab,MatchSpec) -> [Match].
说明:
(1)Match = [term].
(2)MatchSpec = match_spe().
(3)select的优势:只把需要的数据搬到process中,减少不必要的数据转移。ets实现了一个虚拟机,把matchspec编译成opcode,eval的时候,只把需要的数据拷贝到process中,大大减少数据转移的开销。
举例:
ets:new(t ,[named_table]).
ets:insert(t,[{1,2},{2,b},{3,c},{4,d}].
MS = ets:fun2ms( fun({X,Y}) -> when (X>1) or (X<5) -> {Y} end).
> [{{'$1','$2'},[{'or',{'>','$1',1},{'<','$1',5}}],[{{'$2'}}]}]
ets:select(t,MS).
> [{2},{b},{c},{d}].
注意:(1)注意加黄色底的term的格式是一样的。(2)include_lib("stdlib/include/ms_transform.hrl").
常用:
获取ets表的大小,即对象个数: ets:info(Tab,size) -> integer().
阅读(3893) | 评论(0) | 转发(0) |