所以我一直在使用 ETS - 效果很好。但是,我将它用作路由数据的缓存 - 我在加载模块时加载它,并在进行更改时保存(读取远多于写入)。
我在想 DETS 会让事情变得更干净——我不必担心管理表的持久性。这会很好地使用 DETS 吗?(大小不是问题,主要关注读取性能的大幅提高 - 所有数据都可以轻松放入内存)。
在大多数情况下,DETS 比 ETS 慢得多,但我想如果您的数据量很小,那么大多数情况下它会被磁盘缓存缓存,并且在您第二次读取它时检索它的速度会更快,所以最好的事情是试试你的使用类型
但是您是否考虑过直接使用 Mnesia 而不是 ETS?使用 Mnesia 表类型 disc_copies,您将获得 ETS 的速度和持久性
直接来自Dets 手册页:
“由于 Dets 执行的所有操作都是磁盘操作,重要的是要意识到单个查找操作涉及一系列磁盘查找和读取操作。因此,Dets 函数比相应的 Ets 函数慢得多,尽管Dets 导出了一个类似的界面。”
也就是说,对于以读取为主的存储,Dets 不是最佳选择。
(我必须承认我发现这个设计决策很奇怪——更好的实现应该缓存最近的查找。但是,由于 Ets 和 Dets 是 Erlang 中的基本设施,我猜实现者将优化留给了用户。)
对于很少写入,读取许多可以保存在内存中的数据,请查看“Mochiglobal”。Mochiweb 有一个简洁的模块,它通过代码管理系统滥用 Erlang 的模块常量共享堆,通过动态生成具有给定值的模块作为常量来提供对术语的超快速访问。
Riak 使用 Mochiglobal 作为环状态 IIRC。
她的来源:
https://github.com/mochi/mochiweb/blob/master/src/mochiglobal.erl
当然,这里绝对没有持久性,但是如果您希望对读取进行大量优化,那么没有比这更好的了。