gpt4 book ai didi

erlang - Mnesia:包表类型是如何实现的?

转载 作者:行者123 更新时间:2023-12-02 21:48:37 26 4
gpt4 key购买 nike

我有一个带有整数键(时间戳)的表,其中包含应从数据库中删除特定记录的时间。还有一个清理查询,它从该表中获取过期时间小于现在的记录并将其删除。

Erlang 文档说,有四种类型的表类型:setordered_setbagduplicate_bag.

  • set是用哈希表实现的,所以读取需要O(1)的时间复杂度。
  • ordered_set 是使用树实现的,因此读取需要 O(log(n)) 时间复杂度,但它更好地处理后续间隔。
  • 我没有找到关于bag 实现的信息。

ordered_set 看起来很理想,但我不能使用它,因为两条记录可以具有相同的时间戳。所以问题是:

bag 表是如何实现的,它是否适合查询后续间隔?如果没有,我如何获得“ordered_bag”功能?

最佳答案

Mnesia 的bag 是使用ETSDETS 实现的,其他表类型也是如此[1]。此外,Mnesia 不支持 duplicate_bag 表 - 您可以从文档 [2] 中看到它。因此,我们可以得出结论,Mnesia 中的 bag 是作为哈希表实现的,并且具有恒定的查找时间,因为 ETSDETS bag 被实现为哈希表 [3]。 [4] 还说 setbag 在 Mnesia 中实现为哈希表。

  1. Learn You Some Erlang
  2. Erlang -- mnesia:create_table/2
  3. Erlang Programming by Fransecso Cesarini and Simon Thompson, Ch.10
  4. Erlang and OTP in Action by Martin Logan, Eric Merritt, and Richard Carlsson, Ch.9

关于问题的其余部分:

不,bag 不适合查询后续间隔。得到一个间隔从 bag 表你必须完全遍历它。我看到两个可能的决定那个。

首先,您可以使用额外的ordered_set表来保持顺序,因为@niahoo 建议。因此,您将能够有效地查询属于某个时间间隔的所有时间戳,并且然后从你的 bag 表中删除相应的条目,这也会很有效,因为此时您将知道所有 key 。

其次,你可以使用ordered_set{时间戳,[值]}。这将需要额外的手动操作来插入并删除单个条目,但这将使您免于创建其他表如果您只需要查询按 timestamp 分组的它们。

关于erlang - Mnesia:包表类型是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19091239/

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