大多数只读使用DETS

时间:2011-01-25 04:47:03

标签: erlang ets dets

所以我一直在使用ETS - 效果很好。但是,我将它用作路由数据的缓存 - 我在模块加载时加载,并在进行更改时保存(读取的内容远远超过写入)。

我在想DETS会让事情变得更清晰 - 我不必担心管理表的持久性。这可以很好地利用DETS吗? (大小不是问题,主要是关注读取性能的大幅提升 - 所有数据都可以很容易地适应内存)。

3 个答案:

答案 0 :(得分:4)

在大多数情况下,DETS比ETS慢得多,但我想如果你的数据大小很小,那么大多数会被磁盘缓存缓存,第二次读取时会更快,所以最好事情就是尝试使用你的使用方式

但您是否考虑直接使用Mnesia而不是ETS?使用Mnesia表类型disc_copies,您将获得ETS的速度和仍然持久性

答案 1 :(得分:2)

直接来自Dets man page

  

“由于Dets执行的所有操作都是磁盘操作,因此必须认识到单个查找操作涉及一系列磁盘搜索和读取操作。因此,Dets功能比相应的Ets慢得多。功能,虽然Dets导出类似的界面。“

也就是说,对于以读取为主的存储,Dets不是最佳选择。

(我必须承认我发现这个设计决定很奇怪 - 一个更好的实现应该缓存最近的查找。但是,因为Ets和Dets是Erlang的基本工具,我想实现者为用户留下了优化。)

答案 2 :(得分:0)

对于很少写的内容,请阅读许多您可以保留在内存中的数据,请查看“Mochiglobal”。 Mochiweb有一个简洁的模块,通过代码管理系统滥用Erlang的共享堆模块常量,通过生成具有给定值的模块作为常量来提供对术语的超快速访问。

Riak使用Mochiglobal作为环状态IIRC。

她的来源:

https://github.com/mochi/mochiweb/blob/master/src/mochiglobal.erl

当然,这里绝对没有持久性,但是如果你想要大量优化读取,你就不会比这更好。