大多数只读使用DETS

所以我一直在使用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 当然,这里绝对没有持久性,但是如果你想要大量优化读取,你就不会比这更好。     

要回复问题请先登录注册