gpt4 book ai didi

erlang - 我应该如何使 ETS 表中的条目自动过期,同时限制其总大小?

转载 作者:行者123 更新时间:2023-12-02 02:22:35 27 4
gpt4 key购买 nike

我有很多分析数据,我希望每隔一段时间(假设一分钟)聚合这些数据。数据被发送到一个进程,该进程将其存储在 ETS 表中,并且计时器每隔一段时间发送一次它是处理表并删除旧数据的消息。

问题是传入的数据量差异很大,我基本上需要对其做两件事:

  • 如果传入的数据量太大,则丢弃最旧的数据并推送新数据。这可以视为固定大小的队列,如果数据量达到限制,队列将开始丢弃当新数据到达后面时,前面的事情就会发生。
  • 如果队列未满,但数据已在那里放置了一段时间,则自动丢弃它(在固定超时后)。

如果满足这两个条件,我基本上可以假设该表具有恒定的大小,并且其中的所有内容都比 X 新。

问题是我还没有找到一种有效的方法来同时完成这两件事。我知道我可以使用匹配规范来删除所有早于 X 的整体,如果索引是时间戳,这应该相当快。虽然我不确定这是否是定期修剪表格的最佳方法。

第二个问题是将表的总大小保持在一定的限制之下,我不太确定该怎么做。我想到的一个解决方案是使用每次插入的自动增量字段,当修剪表时,查看第一个和最后一个索引,计算差异,然后再次使用匹配规范删除低于阈值的所有内容。

说了这么多,感觉我可能正在使用 ETS 表来做一些它不该做的事情。有没有更好的方法来存储这样的数据,或者我是否正确地解决了这个问题?

最佳答案

您可以使用ets:info(Tab, memory)确定占用的数据量。结果以字数表示。但是有一个问题!如果您存储二进制文件,则仅包含堆二进制文件。因此,如果您存储的大部分是普通的 Erlang 术语,您可以使用它并使用您所描述的时间戳,这是一种可行的方法。对于以字节为单位的大小,只需乘以 erlang:system_info(wordsize)

关于erlang - 我应该如何使 ETS 表中的条目自动过期,同时限制其总大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30549618/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com