【问题标题】:Union ETS tables [closed]联盟 ETS 表 [关闭]
【发布时间】:2013-08-03 18:01:12
【问题描述】:

我尝试将两个 ETS 表合并为一个 ETS 表。 我知道的唯一方法是创建第三个表并将这两个表的记录插入到第三个表中。 有没有更好的办法?

【问题讨论】:

    标签: erlang ets


    【解决方案1】:

    ets:insert 允许一个元组列表。另一方面,ets:tab2list 将 ets 表导出为元组列表。这意味着您可以轻松地将一个 ets 表导入到另一个表中。

    不完全是联合,但您最终会得到一个包含前两个表的表,而无需创建第三个 ets 表,这似乎是您试图实现的目标。

    一个小例子:

    ets:new(list_a,[named_table]).
    ets:new(list_b,[named_table]).
    
    ets:insert(list_a,{one,1}).
    ets:insert(list_b,{two,2}).
    ets:insert(list_b,{three,3}).
    
    ets:insert(list_a,ets:tab2list(list_b)).
    
    ets:tab2list(list_a).
    % list_a = [{three,3},{two,2},{one,1}]
    

    在相同键的情况下会发生什么取决于您正在使用的 ETS 表的类型 (erlang doc):

    如果表是一个集合并且插入对象的键匹配 表中任何对象的键,旧对象将被替换。如果 该表是一个ordered_set 和插入对象的键 比较等于表中任何对象的键,旧对象 也被替换。如果列表包含多个对象 匹配键和表是一组,将插入一个,哪个 没有定义。同样的事情也适用于ordered_set,但也会 如果键比较相等,就会发生。

    此外,您可能想要使用ets:insert_new,它不会覆盖。

    【讨论】:

    • 谢谢,但没有不同的方式(就概念插入表条目而言)来创建第三个表。我使用包含几百兆字节的表。所以这种方式不适合我。我需要一种可以复制整个表格区域的方法
    • 也可以在第一个 ETS 表上进行迭代,将每条记录写入另一个 ETS 表中(您可以使用 first & next 函数或简单地折叠)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 2021-12-28
    • 2011-03-19
    • 2011-11-19
    相关资源
    最近更新 更多