mapReduceアルゴリズムを使用したコースで作業しているので、ビッグデータファイルからErlangでetsテーブルを作成し、同時に作業したいと思います。テーブルが非常に大きいことが判明しました。mapReduceアルゴリズムを使用してテーブルを同時に検索できるように、1つの大きなテーブルをいくつかの小さなテーブルに分割する方法があるかどうかを知りたいです。1つの大きなテーブルを分割する方法はありますか?テーブルをサブテーブルに??? Thnx。
2 に答える
私は、ほとんどの場合、RAM に保存しなければならないイントラネット アプリに取り組んできました。メカニズムcaching library
を抽象化するのに役立つ安定版を作成しました。このライブラリでは、テーブルのメソッドを作成、所有、および公開するETS
作業を行うワーカーを作成します。私はそれらに名前を付けました:と. これらの 2 つは、いずれかが問題を起こした場合に備えて、冗長な方法で所有権を相互に譲渡し続けます。アプリケーションを入手してください: http://www.4shared.com/zip/z_VgKLpa/cache-10.html
解凍して、 を使用して再コンパイルし、次にそれを引き込み。gen_servers
ETS
cache1
cache2
Emake file
Erlang Lib directory
F:\programming work\cache-1.0>erl -pa ebin Eshell V5.9 (^G で中止) 1> アプリケーション: 開始 (キャッシュ)。 わかった 2> rd(生徒、{名前、年齢、性別})。 学生 3> cache_server:new(学生、セット、2)。 わかった 4> cache_server:write(#student{name = "ムザーヤヨシュア", 性別 = 「男性」、年齢 = (2012 - 1987) })。 わかった 5> cache_server:write(student,[#student{name = "ジョー",sex = "男性"}, #student{name = "Mike",sex = "Male"}]))。 わかった 6> cache_server:read({student,"ムザーヤ・ジョシュア"}). [#student{name = "ムザヤ ジョシュア",age = 25,sex = "男"}] 7> cache_server:read({student,"Joe"}). [#student{名前 = "ジョー",年齢 = 未定義,性別 = "男性"}] 8> cache_server:get_tables(). [{cache1,[学生]},{cache2,[]}] 9> rd(class,{class,no_of_students})。 クラス 10> cache_server:get_tables(). [{cache1,[学生]},{cache2,[]}] 11> cache_server:new(クラス、セット、2)。 わかった 12> cache_server:get_tables(). [{キャッシュ1,[生徒]},{キャッシュ2,[クラス]}] 13> cache_server:write(クラス、[ #class{class = "プライマリ" ++ integer_to_list(N), no_of_students = ランダム:uniform(50)} || N <- リスト:seq(1,7)]) . わかった 14> cache_server:read({class,"プライマリ 6"}). [#class{class = "プライマリ 6",no_of_students = 30}] 15> cache_server:delete({class,"プライマリ 2"}). わかった 16> cache_server:get_cache_state(). [{server_state,cache1,1,[学生]}, {server_state,cache2,1,[クラス]}] 17> rd(食べ物、{名前、種類、値})。 食物 18> cache_server:new(食品、セット、2). わかった 19> cache_server:write(food,[#food{name = "オレンジ", type = "フルーツ",value = "ビタミンC"}])。 わかった 20> cache_server:get_cache_state(). [{server_state,cache1,2,[food,student]}, {server_state,cache2,1,[クラス]}] 21>の重要性を理解するために、またはがクラッシュ
ets:give_away/3
したときに何が起こるか見てみましょう。現在のサーバーの状態 (テーブルの現在の所有者を示す) は次のとおりです。cache1
cache2
21> cache_server:get_cache_state(). [{server_state,cache1,2,[food,student]}, {server_state,cache2,1,[クラス]}] 22>クラッシュさせてみましょう
cache1
。22> gen_server:cast(cache1,stop). わかった キャッシュ サーバー: cache2 がサーバー: cache1 からテーブル: food を引き継いだ 23> キャッシュサーバー: cache2 がサーバー: cache1 からテーブル: student を引き継いだ 23> cache_server:get_cache_state(). [{server_state,cache1,0,[]}, {server_state,cache2,3,[student,food,class]}] 24>同様に、もう1つ:
24> gen_server:cast(cache2,stop). わかった キャッシュサーバー: cache1 がサーバー: cache2 からテーブル: student を引き継いだ 25> キャッシュサーバー: cache1 がサーバーからテーブル: food を引き継いだ: cache2 25> キャッシュサーバー: cache1 がサーバー: cache2 からテーブル: クラスを引き継いだ 25> cache_server:get_cache_state(). [{server_state,cache1,3,[class,food,student]}, {server_state,cache2,0,[]}] 26>それでおしまい !ソース コードの概念を使用して、自分で何かを作成できます。その
ETS
ライブラリによって作成されたテーブルはpublic
およびnamed
であるため、関数を使用して直接アクセスできますETS
。
テーブルを分割しなくても、ETS テーブルを同時に検索できます。
http://www.erlang.org/doc/man/ets.html#new_2_read_concurrency
テーブルが大きい場合は、適切な一致パターンを使用して検索サイズを減らすことをお勧めします: http://www.erlang.org/doc/man/ets.html#select-2