ets,dets与大数据存储

ets与dets都是用来存大数据的机制


ets是Erlang term storage的缩写, dets则是disk ets.
它们不同的就是ets存在内存里面,而dets则存在磁盘上。

ets存的数据表是暂时性的,拥有它的进程挂了,它也会挂掉.
dets就算程序完成或者挂了,数据表还是持久存在的.如果是异常退出的, 可以进行修复.

ets表看起来像是由erlang实现的,但实际上它是由运行时系统实现的,所以具有更高的性能. 且有一个特性: ets表不会被垃圾回收!

操作

建表

ets:new和dets:open_file

插入
ets:insert(TableId, X), x 是一个元组或者一个元组列表. 定义了一些参数

查找
ets:lookup(TableId, Key) 它会返回一个元组列表.

删除表
ets:delete(TableId)

表类型

四种: 集合(sets), 有序集(sorted sets), 袋(bags),可重复袋(duplicated bags)

集合:
所有记录的键(key)都是唯一的.
比如先后存{a,1},{b,1}可以 得结果{a,1},{b,1},两条记录。
但先后存{a, 1},{a,3}得到的结果会是{a,3}, 一条记录。

有序集:
特殊的集合, 按键值排序

袋:
记录的键值可以相同, 但数据不同是相同的.
比如先后存{a,1},{a,3}可以得两条记录;
但先后存{a,1}, {a,1}只有一条记录。

可重复袋:
记录的键值可相同, 记录值也可以相同
先后存{a,1}, {a,1}会有两条记录。


ets效率建议

ets表的底层是由哈希表实现的,不过有序集例外,它是由平衡二叉树实现的。 所以不管是插入还是查找,集合的效率要比有序集高.

可重复袋要比袋的效率要高, 因为袋要和原来的记录比较是否有相同的记录已经插入. 如果一份大数据,相同的记录越多,袋的效率就越慢.

一张ets表是由创建它的进程所拥有, 当此进程调用ets:delete或者进程挂了的时候, 表会被删除.

一般情况下, 插入一个元组到一张ets表中, 所有代表这个元组的结构都会被从进程的栈和堆中,复制到ets表中; 当查找一条记录时, 结果元组从ets表中复制到进程的栈和堆中。

但是大型二进制(large binaries) 数据却不是这样! 它们被存入自已所拥有的堆区域(off-heap area)中。这个区域可以被多个进程,ets表,和独立二进制数据所共享。它由引用计数的垃圾回收策略管理, 这个策略会跟踪到底有多少个进程/ets表/二进制数据引用了这个大型二进制数据. 如果引用数为0的话, 此大型二进制数据就会被垃圾回收掉.

看起来很和复杂, 实际结论就是: 两进程间发消息用大型二进制数据消耗很低, 往ets表插入元组用二进制数据也很划算。我们应该尽可能采用二进制数据来实现字符串或无类型的大数据块.


ets建表
转自:http://coderplay.iteye.com/blog/101281
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值