Erlang 大多数情况下,DET是只读的

Erlang 大多数情况下,DET是只读的,erlang,ets,dets,Erlang,Ets,Dets,所以我一直在使用ETS——效果很好。但是,我使用它作为路由数据的缓存—在模块加载时加载,在进行更改时保存(读取远远多于写入) 我在想DET会让事情变得更干净——我不必担心管理表的持久性。这是DETS的一个好用途吗?(大小不是问题,主要关注的是读取性能的大幅提高——所有数据都可以轻松放入内存) 直接从以下位置开始: 由于Dets执行的所有操作都是磁盘操作,因此必须认识到单个查找操作涉及一系列磁盘寻道和读取操作。因此,Dets功能比相应的Ets功能慢得多,尽管Dets导出类似的接口 也就是说,对于以

所以我一直在使用ETS——效果很好。但是,我使用它作为路由数据的缓存—在模块加载时加载,在进行更改时保存(读取远远多于写入)

我在想DET会让事情变得更干净——我不必担心管理表的持久性。这是DETS的一个好用途吗?(大小不是问题,主要关注的是读取性能的大幅提高——所有数据都可以轻松放入内存)

直接从以下位置开始:

由于Dets执行的所有操作都是磁盘操作,因此必须认识到单个查找操作涉及一系列磁盘寻道和读取操作。因此,Dets功能比相应的Ets功能慢得多,尽管Dets导出类似的接口

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


(我必须承认,我觉得这个设计决策很奇怪——一个更好的实现应该缓存最近的查找。然而,由于Ets和DET是Erlang中的基本设施,我猜实现者将优化留给了用户。)

在大多数情况下,DETS比ETS慢得多,但我想,如果您的数据大小很小,那么大部分数据都会被磁盘缓存,并且在您第二次读取数据时检索速度会更快,因此最好是根据您的使用类型进行尝试


但是你有没有考虑过直接使用记忆法而不是ETS?使用Mnesia table type光盘拷贝,您将获得ETS的速度和持久性

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

Riak使用Mochiglobal表示环状态IIRC

她的消息来源是:


当然,这里绝对没有持久性,但是如果您希望对读取进行大量优化,那么没有比这更好的了。

我认为需要记住的是,ETS和DET都不是数据库,它们都是数据存储。要获得更复杂的行为,您需要在适当的数据库应用程序(如Mnesia)中使用它们。我从未说过Ets或DET是数据库。@rvirding的意思是,DET是一个低级系统,其中缓存被剥离。如果将ETS和DET结合起来,那么自己编写这样一个缓存层是相当容易的——但缓存回收的好策略是什么?通常最好由用户选择。谢谢,是的,我应该选择RTFM;)谢谢,我会考虑的。我试图避免依赖,直到我真的需要它们,我真的不需要太多的记忆,但我可能应该相信它比我相信我会产生的替代品。