今天在工作中接触到了ets,大概看了一下,理解了个大概,现在就来好好学习一下。
ets是个系统模块,可以用来高效存储海量的Erlang数据。ETS是Erlang Term Storage (Erlang数据存储)的缩写。ETS是相当高效的:可以用它存储海量的数据(只要有足够的内存),执行查找的时间也是恒定的(在某些情况下是对数时间)。ETS表里的数据保存在内存里,它们是易失的。当ETS表被丢弃或者控制它的Erlang进程终止时,这些数据就会被删除。
ETS表广泛应用于那些必须以高效方式操作大量数据的应用程序,以及用非破坏性赋值和 “纯”Erlang数据结构编程的开销过大之时。 ETS表看上去像是用Erlang实现的,但事实上它们是在底层的运行时系统里实现的,有着不 同于普通Erlang对象的性能特点。特别需要指出的是,ETS表没有垃圾收集机制,这就意味着即 使ETS表极其巨大也不会有垃圾收集的负担。不过,创建或访问ETS对象仍然会带来少许开销。
ETS有四种基本操作。
1.创建一个新表或打开现有的表
用ets:new实现
2.向表里插入一个或多个元组
这里要调用insert(TableId, X),其中X是一个元组或元组列表。
3.在表里查找某个元组
这里要调用lookup(TableID, Key)。得到的结果是一个匹配Key的元组列表。
lookup的返回值始终是一个元组列表,这样就能对异键表和同键表使用同一个查找函数。 如果表的类型是同键,那么多个元组可以拥有相同的键。如果表的类型是异键,那么查 找 成功后的列表里只会有一个元素。
4.丢弃某个表
用完某个表后可以告知系统 ets:delete (TableId)。
用下面这个小测试程序来演示它们是如何工作的
-module(ets_test).
-author("YDQ").
%% API
-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).
这个程序会为四种模式各创建一个ETS表,然后向表内插入{a,1}、{b,2}、{a,1}和{a,3}。 然后调用tab2list,它会把整个表转换成一个列表并打印出来。
在异键型的表里,每个键都只能出现一次。如果先向表内插入元组{a,1}然后再插入{a,3}, 那么最终值将是{a,3}。异键表和有序异键表的唯一区别是有序异键表里的元素会根据它们的键 排序。用tab2list把表转换成列表之后就能看到这一顺序了。 同键型的表可以有多个相同的键。举个例子,当我们先插入{a,1}再插入{a,3}时,同键表 就会同时包含这两个元组,而不仅仅是后一个。副本同键表里允许有多个完全相同的元组,这样 当连续插入两次{a,1}时,表里就会有两个相同的{a,1}元组,而普通同键表里只会留下一个。