Chinaunix首页 | 论坛 | 博客
  • 博客访问: 132587
  • 博文数量: 12
  • 博客积分: 102
  • 博客等级: 入伍新兵
  • 技术积分: 150
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-25 09:03
个人简介

80后程序员

文章分类

全部博文(12)

文章存档

2020年(1)

2018年(3)

2013年(5)

2011年(1)

2010年(2)

我的朋友

分类: Erlang

2013-02-01 14:10:07

ETS 常用的操作

一、建表, 删表
建表:TabPid = ets:new(tableName,Options).
删表:ets:delete(Tab).

说明:
  1. 1、TabPid 是 ets 表的 pid 引用.
  2. 2、tableName 是ets 表的名称.
  3. 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. 1、Tab 是表的标识,可以是pid引用,也可以是表名(named_table).
  2. 2、Data 是要添加的数据,格式是 tuple() | [ tuple()], 如果表的类型(Type)是 set | ordered_set, 那么相同的key的数据将被替换。
三、删除数据
  1. 1、ets:delete(Tab,Key).
说明:
(1)从表Tab中删除某个Key
  1. 2、ets:detete_all_objects(Tab) -> true
说明:
(1)删除表中所有的对象,object = {key,value},该操作是一个原子操作。
  1. 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. 1、匹配 match 
ets:match(Tab,Pattern) -> [Match].
说明:
(1)Match = [term].
(2)match 把数据从erts拷贝到process中,会遍历整个ets表,当表的数量很大的时候,效率会很低,所以慎用。
  1. 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) |
0

上一篇:VIM 常用操作

下一篇:erlang的运算符

给主人留下些什么吧!~~