2013-08-02 87 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