因此,我一直在使用ET-效果很好。但是,我将其用作路由数据的缓存 - 我在模块加载时加载它,并在进行更改时保存(读取的范围远远超过书面)。

我当时认为Dets会使事情变得更加干净 - 我不必担心管理桌子的持久性。这会很好地利用DETS吗? (大小不是问题,主要关注读取性能的重大提高 - 所有数据都可以轻松符合内存)。

有帮助吗?

解决方案

在大多数情况下,DETS比ETS要慢得多,但是我想,如果您的数据大小很小,则大多数会被磁盘缓存缓存,并且第二次阅读时会更快地检索,所以最好的事情是尝试使用您的使用类型

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

其他提示

直接从 Dets Man Page:

“由于DETS执行的所有操作都是磁盘操作,因此重要的是要意识到单个查找操作涉及一系列磁盘寻求和阅读操作。因此,DETS功能比相应的ETS功能要慢得多,尽管Dets导出类似的接口。”

也就是说,对于大量的存储,DETS并不是最佳选择。

(我必须承认,我觉得这个设计决策很奇怪 - 应该缓存最近查找的更好的实现。但是,由于ETS和DET是Erlang的基本设施,因此我想实施者为用户留下了优化。)

对于很少写的,请阅读许多您可以保留记忆的数据,请查看“ Mochiglobal”。 Mochiweb具有一个整洁的模块,该模块通过代码管理系统滥用Erlang的模块常数共享堆,以通过生成具有给定值作为即时的常数的模块来提供对术语的超级访问。

Riak使用Mochiglobal作为环状态,IIRC。

她的来源:

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

当然,这里绝对没有持久性,但是如果您希望大力优化阅读,那么您就不会变得更好。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top