我们想知道如何有效地找到两个 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/

10-13 02:06