庄周梦蝶

生活、程序、未来
   :: 首页 ::  ::  :: 聚合  :: 管理

ets和dets的效率建议

Posted on 2007-09-27 16:33 dennis 阅读(2168) 评论(2)  编辑  收藏 所属分类: erlang
   ets表的底层是由哈希表实现的,不过ordered_set例外,它是由平衡二叉树实现的。 所以不管是插入还是查找,set的效率要比ordered_set高.采用set还是ordered_set取决于你的需求,当你需要一个有序的集合时,显然应当采用ordered_set模式。

duplicate_bag要比bag的效率要高, 因为bag要和原来的记录比较是否有相同的记录已经插入. 如果数据量很大,相同的记录越多,bag的效率就越差.

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

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

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

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

评论

# re: ets和dets的效率建议  回复  更多评论   

2007-09-28 16:26 by 千里冰封
ETS是什么?

# re: ets和dets的效率建议  回复  更多评论   

2008-10-15 14:36 by z_axis
ETS = Erlang Term Storage

只有注册用户登录后才能发表评论。


网站导航: