gpt4 book ai didi

Erlang - ETS 表之间的比较

转载 作者:行者123 更新时间:2023-12-02 18:00:34 25 4
gpt4 key购买 nike

我们想知道如何有效地查找两个 ets 表之间的相互元素,我们尝试了 ETS 和 QLC 模块,但不知道如何做到这一点,我们在 [bag] 选项上使用 ets,这意味着同一个键有多个值。

我们正在寻找最快、最有效的解决方案。

最佳答案

很难回答您的问题,因为我们对表大小、内容结构、执行上下文(并行度?、频率...)一无所知

您是否使用lists:filter/2测试了基本解决方案?

1> ets:new(t,[bag,named_table]).
t
2> ets:new(s,[bag,named_table]).
s
3> ets:insert(t,[{1,a},{1,b},{2,c}]).
true
4> ets:insert(s,[{3,a},{1,b},{2,d}]).
true
5> lists:filter(fun(X) -> lists:member(X,ets:tab2list(s)) end, ets:tab2list(t)).
[{1,b}]
6>

如果(我猜)您的表很大和/或其内容复杂,您可以故意创建一个新的 ets set 表,其键是表的完整记录,然后使用过滤第二个表的记录函数 ets:insert_new/2 作为谓词,创建的开销可能值得与元素的搜索相比:

6> ets:new(r,[set,named_table]).                                                
r
7> lists:foreach(fun(X) -> ets:insert(r,{X}) end,ets:tab2list(s)).
ok
8> ets:tab2list(r).
[{{3,a}},{{2,d}},{{1,b}}]
9> lists:filter(fun(Y) -> ets:insert_new(r,{Y}) == false end,ets:tab2list(t)).
[{1,b}]
10>

在本示例中,我使用了 ets:tab2list/1 以便在 shell 中轻松进行演示,但可以使用任何遍历 ets 表的方法。

关于Erlang - ETS 表之间的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31815828/

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