限制 ETS 存储的增长

Posted

技术标签:

【中文标题】限制 ETS 存储的增长【英文标题】:Limit the growth of ETS storage 【发布时间】:2016-12-28 10:16:14 【问题描述】:

我正在考虑在一个新的 Elixir 项目中使用 Erlang 的 ETS 作为用户搜索的缓存。根据用户输入,系统将使用昂贵的第三方 API 进行查找。

为了避免重复调用相同的用户输入,我打算在外部 API 前面放置一个缓存层,ETS 似乎是一个不错的选择。但是,由于用户输入的变化没有限制,我担心 ETS 表所需的存储空间会无限增长。

在阅读有关 ETS 的文章时,我还没有看到其他人讨论过对 ETS 中表格大小的担忧。那是因为这对 ETS 来说是一个不正常的用例吗?

乍一看,我的偏好是限制 ETS 表中的条目数量,并在达到限制后拒绝(即删除)最旧的条目......

是否有一个通用的策略来处理 ETS 中无限数量的条目?

【问题讨论】:

google 的“erlang ets cache”结果的第一页提供了很多有用的命中。你看了吗? 【参考方案1】:

我在生产中使用 ETS 表,例如带有 redis API 的“智能无效缓存”(它还具有主-主复制,如 SQL WAL 日志)。

最大的大小约为 200-300Mb,它们有超过 100 万个项目。过去2年没有任何问题。我知道限制ERL_MAX_ETS_TABLES,但没有任何关于尺寸的信息。

我为这些表设置了特殊的“智能索引”。 ETS select/match/etc 很慢,因为这种方法会传递表中的所有元素。

【讨论】:

【参考方案2】:

使用ets:tab2list(TableId) 函数将ETS 表转换为通用列表。之后,您可以使用众所周知的 BIF length(List) 检查列表的大小。 最后但同样重要的是,您现在可以设置缓冲区(只需使用 pattern matchingifcase 检查列表的大小表达

【讨论】:

以上是关于限制 ETS 存储的增长的主要内容,如果未能解决你的问题,请参考以下文章

oracle表空间自动增长好还是固定好

oracle创建表空间 扩展表空间文件 修改表空间自动增长

如何在Qt Designer中限制布局的增长(大小)?

SQLserver利用存储过程新加一行,id设为自动增长,结果运行后没有显示结果,ID增长了,其他信息没有存进

追踪 GitHub 上前 100 个存储库的增长情况?

7倍速增长,浪潮分布式存储强势领跑