2012-08-09 12 views
1

큰 데이터 파일에서 Erlang에 ets 테이블을 작성 했으므로 mapReduce 알고리즘을 사용하는 과정에서 작업했습니다. 동시에 작업하고 싶습니다. 테이블이 매우 큰 것으로 밝혀졌고 테이블을 동시에 검색 할 수 있도록 큰 테이블을 몇 개의 작은 테이블로 분할하는 방법이 있는지 알고 싶습니다 mapReduce algo를 사용하여 분할 할 방법이 있습니까? 하위 테이블에 하나의 큰 테이블 ??? Thnx. 오류가 발생했습니다.

http://www.erlang.org/doc/man/ets.html#new_2_read_concurrency

테이블이 큰 경우

, 당신이 검색의 크기를 줄일 수 있도록 좋은 경기 패턴을 사용하는 것이 좋습니다 :

답변

1

저는 대부분 RAM에 물건을 보관해야하는 인트라넷 앱에서 작업했습니다. ETS 메커니즘을 추상화하는 데 도움이되는 안정적인 caching library을 만들었습니다. 이 라이브러리에서 저는 ETS 테이블에 대한 메소드를 만들고, 소유하고 노출하는 작업자 인 gen_servers을 만듭니다. 나는 그것들을 cache1cache2으로 명명했다. 이 둘은 소유권이 서로 상충되는 경우 중복 된 방식으로 소유권을 양도합니다. 응용 프로그램 가져 오기 : http://www.4shared.com/zip/z_VgKLpa/cache-10.html 그냥 압축을 풀고 Emake file을 사용하여 다시 컴파일 한 다음 Erlang Lib directory

에 입력하십시오. 어떻게 작동하는지 보려면 여기를 참조하십시오.

 
F:\programming work\cache-1.0>erl -pa ebin 
Eshell V5.9 (abort with ^G) 
1> application:start(cache). 
ok 
2> rd(student,{name,age,sex}). 
student 
3> cache_server:new(student,set,2). 
ok 
4> cache_server:write(#student{name = "Muzaaya Joshua", 
         sex = "Male",age = (2012 - 1987) }). 
ok 
5> cache_server:write(student,[#student{name = "Joe",sex = "Male"}, 
       #student{name = "Mike",sex = "Male"}]). 
ok 
6> cache_server:read({student,"Muzaaya Joshua"}). 
[#student{name = "Muzaaya Joshua",age = 25,sex = "Male"}] 
7> cache_server:read({student,"Joe"}). 
[#student{name = "Joe",age = undefined,sex = "Male"}] 
8> cache_server:get_tables(). 
[{cache1,[student]},{cache2,[]}] 
9> rd(class,{class,no_of_students}). 
class 
10> cache_server:get_tables(). 
[{cache1,[student]},{cache2,[]}] 
11> cache_server:new(class,set,2). 
ok 
12> cache_server:get_tables(). 
[{cache1,[student]},{cache2,[class]}] 
13> cache_server:write(class,[ 
     #class{class = "Primary " ++ integer_to_list(N), 
     no_of_students = random:uniform(50)} || N <- lists:seq(1,7)]) 
. 
ok 
14> cache_server:read({class,"Primary 6"}). 
[#class{class = "Primary 6",no_of_students = 30}] 
15> cache_server:delete({class,"Primary 2"}). 
ok 
16> cache_server:get_cache_state(). 
[{server_state,cache1,1,[student]}, 
{server_state,cache2,1,[class]}] 
17> rd(food,{name,type,value}). 
food 
18> cache_server:new(food,set,2). 
ok 
19> cache_server:write(food,[#food{name = "Orange", 
         type = "fruit",value = "Vitamin C"}]). 
ok 
20> cache_server:get_cache_state(). 
[{server_state,cache1,2,[food,student]}, 
{server_state,cache2,1,[class]}] 
21> 
이제 ets:give_away/3의 중요성을 이해하기 위해 cache1 또는 cache2 중 하나가 충돌하면 어떻게되는지보십시오. 현재 서버 상태 (테이블의 현재 소유자를 보여줍니다)는 다음과 같습니다.
 
21> cache_server:get_cache_state(). 
[{server_state,cache1,2,[food,student]}, 
{server_state,cache2,1,[class]}] 
22> 
cache1 충돌이 발생합니다.
 
22> gen_server:cast(cache1,stop). 
ok 
     Cache Server: cache2 has taken over table: food from server: cache1 
23> 
     Cache Server: cache2 has taken over table: student from server: cache1 
23> cache_server:get_cache_state(). 
[{server_state,cache1,0,[]}, 
{server_state,cache2,3,[student,food,class]}] 
24> 
마찬가지로 다른 하나는
 
24> gen_server:cast(cache2,stop). 
ok 
     Cache Server: cache1 has taken over table: student from server: cache2 
25> 
     Cache Server: cache1 has taken over table: food from server: cache2 
25> 
     Cache Server: cache1 has taken over table: class from server: cache2 
25> cache_server:get_cache_state(). 
[{server_state,cache1,3,[class,food,student]}, 
{server_state,cache2,0,[]}] 
26> 
입니다. 소스 코드의 개념을 사용하여 직접 만들 수 있습니다. 해당 라이브러리에서 만든 ETS 테이블은 publicnamed이므로 ETS 함수를 사용하여 테이블에 직접 액세스 할 수 있습니다.

관련 문제