2013-08-02 2 views
0

두 개의 ETS 테이블을 하나의 ETS 테이블로 통합합니다. 내가 아는 유일한 방법은 세 번째 테이블을 만들고 두 번째 테이블의 레코드를 세 번째 테이블에 삽입하는 것입니다. 더 좋은 방법이 있습니까?Union ETS 테이블

답변

2

ets:insert은 튜플 목록을 허용합니다. 반면에 ets:tab2list은 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}] 

동일한 키의 경우에는 어떻게됩니까은 (erlang doc)와 함께 작업하는 ETS 테이블의 유형에 따라 달라집니다 삽입 된 개체의 키가 표의 모든 개체의 키와 일치하면 이전 개체가 대체됩니다. 테이블이 ordered_set이고 삽입 된 개체 의 키가 테이블의 개체와 동일한 키와 비교되는 경우 이전 개체 도 대체됩니다. 목록에 일치하는 키가 이고 두 개 이상의 객체가 포함되어 있고 테이블이 집합 인 경우 하나가 삽입되고 은 정의되지 않습니다. ordered_set에도 똑같은 일이 있지만 키가 동일하면 이됩니다.

게다가 덧글을 쓰지 않는 ets:insert_new을 사용할 수 있습니다.

+0

감사하지만 세 번째 테이블을 만들기위한 다른 방법 (개념을 개념적으로 표에 삽입하는 것)은 없습니다. 몇 백 메가 바이트가 들어있는 테이블을 가지고 작업합니다. 그래서이 방법은 나를위한 것이 아닙니다. 전체 테이블 영역을 복사 할 수있는 방법이 필요합니다. – kirild

+0

다른 ETS 테이블의 각 레코드를 쓰는 첫 번째 ETS 테이블을 반복 할 수도 있습니다 (첫 번째 및 다음 함수 또는 단순히 폴드를 사용할 수 있습니다). – Berzemus