2012-08-09 52 views
1

我在一個使用mapReduce算法的工程中工作,所以我從Erlang的大數據文件中構建了一個ets表,我想同時處理它。 該表結果非常大,我想知道是否有辦法將一個大表拆分爲幾個較小的表,以便我可以同時使用mapReduce算法搜索表 ,有沒有什麼辦法可以拆分一張大桌子放入小桌子? Thnx。erlang中的拆分e3

回答

1

我曾在一個內部網應用程序中,我不得不在RAM大部分時間保存的東西。我創建了一個穩定的caching library,它幫助我提取了ETS機制。在這個圖書館中,我創建了工作人員gen_servers,他們的工作是創建,擁有和展示ETS表的方法。我給他們命名爲:cache1cache2。如果其中一方出現問題,這兩家公司將以不必要的方式相互轉讓所有權。獲取應用程序:http://www.4shared.com/zip/z_VgKLpa/cache-10.html 只需將其解壓縮並使用Emake file重新編譯它,然後將其放入您的Erlang Lib directory

要了解它的工作原理,請參閱shell實例。

 
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的重要性,我們來看看 cache1cache2崩潰時會發生什麼情況。請記住,當前服務器狀態(顯示當前表的所有者)是:
 
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函數直接訪問它們。