erlang——ETS和DETS表学习笔记

来源:互联网 发布:侠客风云传 知乎 编辑:程序博客网 时间:2024/05/29 17:14
Ets和dets都是erlang用于高效存储大量erlang数据条目的两个系统模块。
ETS-> Erlang Term Storage
DETS -> disk ETS

ETS和DETS做同一件事:提供大型的“键-值”搜索表。
区别:ETS驻留在内存,DETS驻留在磁盘。
特性:在ETS中,存储数据多少与查询速度无关。
DETS比ETS节省内存。
DETS和ETS的表可以被多个进程共享,可以实现通过这2个模块来进行高效的数据交换。
一个ETS或DETS的表就是一系列Erlang元组。
ETS表中数据存储时临时的,当其被释放时,对应的数据也会全部丢弃。
DETS则不会,原因在于其存储方式。

ETS表不是Erlang本身实现的,它实际是有底层的运行系统实现的。
ETS表不会被垃圾回收。

操作-ETS和DETS有4种基本操作。
1.创建新表或打开已经存在的表。
ets:new
dets:open_file

2.将一个或多个元组插入表
insert(Tablename,X)
X可以是一个元组或元组列表

3.查找元组
lookup(Tablename,Key)
返回结果是匹配Key的元组

4.释放表
dets:close(TableId)
ets:delete(TableId)

表的类型
set,bags这2个类型都各自有两个变种,分别为:
set -> 表中每个元组的键值都不能相同。
ordered set -> 元组进行排序。
bag -> 多个元组可以有相同的键值,但不能有两个完全相同的元组。
duplicatebag -> 不仅多个元组可以有相同的键值,同一个元组也可以在表中出现多次。

元组第一个元素默认为表的键。
ETS表示用散列表来表示的(除了ordered set是二叉树来表示).
散列(hash)->存储元组的位置是通过hash function把元组的关键字映射到存储这个值的内存地址。

一个ETS表隶属于创建它的进程——当这个进程死掉了或者调用了ets:delete后,这个表就被删掉了。


简单的例子:

-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).

运行结果:




原创粉丝点击