所以我一直在使用ETS - 效果很好。但是,我将它用作路由数据的缓存 - 我在模块加载时加载,并在进行更改时保存(读取的内容远远超过写入)。
我在想DETS会让事情变得更清晰 - 我不必担心管理表的持久性。这可以很好地利用DETS吗? (大小不是问题,主要是关注读取性能的大幅提升 - 所有数据都可以很容易地适应内存)。
答案 0 :(得分:4)
但您是否考虑直接使用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
当然,这里绝对没有持久性,但是如果你想要大量优化读取,你就不会比这更好。