某些 ETS 表类型之间有啥区别?

Posted

技术标签:

【中文标题】某些 ETS 表类型之间有啥区别?【英文标题】:What are the differences between certain ETS table types?某些 ETS 表类型之间有什么区别? 【发布时间】:2021-04-22 13:36:18 【问题描述】:

根据manual,ETS 表有 4 种类型:

set – 该表是一个集合表:一个键,一个对象,对象之间没有顺序。这是默认的表格类型。 ordered_set – 该表是一个ordered_set 表:一个键,一个对象,按照Erlang 术语顺序排序,这是 运算符所隐含的顺序。这种类型的表在某些情况下与其他类型的表有一些不同的行为。最值得注意的是,ordered_set 表在它们比较相等时认为键相等,而不仅仅是在它们匹配时。这意味着对于一个ordered_set 表,integer() 1 和float() 1.0 被认为是相等的。这也意味着,如果 float() 和 integer() 混合在表的键中,则用于查找元素的键不一定与返回元素中的键匹配。 bag – 该表是一个 bag 表,它可以有许多对象,但每个对象只有一个实例,每个键。 duplicate_bag – 该表是一个 duplicate_bag 表,每个键可以有多个对象,包括同一对象的多个副本。

虽然我从他们的描述中并不能真正理解它们之间的区别。这里的“对象”和“对象实例”是什么?

【问题讨论】:

【参考方案1】:

set

这是一个常规映射,其中每个键都是唯一的,并且指向一个元组。对单个键的每次后续写入将始终覆盖该键下的现有条目。

1> T = ets:new(t, [set]).
2> ets:insert(T, 1, a).
3> ets:insert(T, 1, b).
3> ets:insert(T, 1, b).
4> ets:insert(T, 1.0, c).
5> ets:lookup(T, 1).
[1,b]

ordered_set

就像set,但通过标准比较运算符保持元素排序并通过== 运算符解决相等问题。因此键 11.0 被视为等效项。

1> T = ets:new(t, [set]).
2> ets:insert(T, 1, a).
3> ets:insert(T, 1, b).
3> ets:insert(T, 1, b).
4> ets:insert(T, 1.0, c).
5> ets:lookup(T, 1).
[1.0,c]

bag

它是一个独特的元组集合。条目可以共享密钥,只要它们的值在某处不同。

1> T = ets:new(t, [bag]).
2> ets:insert(T, 1, a).
3> ets:insert(T, 1, b).
4> ets:insert(T, 1, b).
4> ets:insert(T, 1.0, c).
5> ets:lookup(T, 1).
[1,a,1,b]

duplicate_bag

bag 相同,但不是唯一的。元组可以重复,这意味着每次添加相同元素都会在表中添加新条目

1> T = ets:new(t, [duplicate_bag]).
2> ets:insert(T, 1, a).
3> ets:insert(T, 1, b).
4> ets:insert(T, 1, b).
4> ets:insert(T, 1.0, c).
5> ets:lookup(T, 1).
[1,a,1,b,1,b]

【讨论】:

以上是关于某些 ETS 表类型之间有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

“常规”数据透视表和 olap 类型数据透视表之间的区别

shell变量与C语言变量之间在用法上有啥区别

Erlang - ETS 表之间的比较

使用视图和临时表之间有啥区别(系统资源方面)?

oracle表脚本跟表结构有啥区别,表脚本是否就是我们所说的表结构呢?

LR、SLR 和 LALR 解析器有啥区别?