1

mapReduceアルゴリズムを使用したコースで作業しているので、ビッグデータファイルからErlangでetsテーブルを作成し、同時に作業したいと思います。テーブルが非常に大きいことが判明しました。mapReduceアルゴリズムを使用してテーブルを同時に検索できるように、1つの大きなテーブルをいくつかの小さなテーブルに分割する方法があるかどうかを知りたいです。1つの大きなテーブルを分割する方法はありますか?テーブルをサブテーブルに??? Thnx。

4

2 に答える 2

1

私は、ほとんどの場合、RAM に保存しなければならないイントラネット アプリに取り組んできました。メカニズムcaching libraryを抽象化するのに役立つ安定版を作成しました。このライブラリでは、テーブルのメソッドを作成、所有、および公開するETS作業を行うワーカーを作成します。私はそれらに名前を付けました:と. これらの 2 つは、いずれかが問題を起こした場合に備えて、冗長な方法で所有権を相互に譲渡し続けます。アプリケーションを入手してください: http://www.4shared.com/zip/z_VgKLpa/cache-10.html 解凍して、 を使用して再コンパイルし、次にそれを引き込み。gen_serversETScache1cache2Emake fileErlang 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したときに何が起こるか見てみましょう。現在のサーバーの状態 (テーブルの現在の所有者を示す) は次のとおりです。cache1cache2
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

于 2012-08-10T08:59:51.023 に答える
1

テーブルを分割しなくても、ETS テーブルを同時に検索できます。

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

テーブルが大きい場合は、適切な一致パターンを使用して検索サイズを減らすことをお勧めします: http://www.erlang.org/doc/man/ets.html#select-2

于 2012-08-09T19:46:24.547 に答える