2013-08-02 43 views
0

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

回答

2

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,它不会覆盖。

+0

谢谢,但没有不同的方式(在概念插入表的条目)来创建第三个表。 我使用包含几百兆字节的表。 所以这种方式不适合我。我需要一种方法来复制整个表格区域 – kirild

+0

也可以在第一个ETS表格上迭代,在其他ETS表格中写入每条记录(您可以使用第一个和下一个功能或简单折叠)。 – Berzemus