1

我在使用 mapReduce 算法的课程中工作,所以我从一个大数据文件在 Erlang 中构建了一个 ets 表,我想同时处理它。结果表很大,我想知道是否有办法将一个大表拆分为几个较小的表,以便我可以使用 mapReduce 算法同时搜索表,有什么方法可以拆分一个大表表变成子表???谢谢。

4

2 回答 2

1

我曾在一个 Intranet 应用程序上工作过,在该应用程序中,我大部分时间都必须将内容保存在 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(使用 ^G 中止)
1> 应用程序:启动(缓存)。
好的
2> rd(学生,{姓名,年龄,性别})。
学生
3> 缓存服务器:新(学生,设置,2)。
好的
4> cache_server:write(#student{name = "Muzaaya Joshua",
                        性别 = “男性”,年龄 = (2012 - 1987) })。
好的
5> cache_server:write(student,[#student{name = "Joe",sex = "Male"},
                #student{name = "Mike",sex = "Male"}])。
好的
6> cache_server:read({student,"Muzaaya Joshua"})。
[#student{name = "Muzaaya Joshua",age = 25,sex = "Male"}]
7> 缓存服务器:读取({学生,“乔”})。
[#student{name = "Joe",age = undefined,sex = "Male"}]
8> 缓存服务器:获取表()。
[{cache1,[学生]},{cache2,[]}]
9> rd(班级,{班级,no_of_students})。
班级
10> 缓存服务器:获取表()。
[{cache1,[学生]},{cache2,[]}]
11> 缓存服务器:新(类,集,2)。
好的
12> 缓存服务器:获取表()。
[{cache1,[学生]},{cache2,[班级]}]
13> 缓存服务器:写(类,[
        #class{class = "Primary" ++ integer_to_list(N),
        no_of_students = 随机:统一(50)} || N <- 列表:seq(1,7)])
.
好的
14> cache_server:read({class,"Primary 6"})。
[#class{class = "小学六年级",no_of_students = 30}]
15> cache_server:delete({class,"Primary 2"})。
好的
16> 缓存服务器:获取缓存状态()。
[{server_state,cache1,1,[学生]},
 {server_state,cache2,1,[class]}]
17> rd(食物,{名称,类型,值})。
食物
18> 缓存服务器:新(食物,设置,2)。
好的
19> cache_server:write(food,[#food{name = "Orange",
                        类型=“水果”,价值=“维生素C”}])。
好的
20> 缓存服务器:获取缓存状态()。
[{server_state,cache1,2,[food,student]},
 {server_state,cache2,1,[class]}]
21>
现在,要了解 的重要性ets:give_away/3,让我们看看当cache1orcache2崩溃时会发生什么。请记住,当前服务器状态(显示表的当前所有者)是:
21> 缓存服务器:获取缓存状态()。
[{server_state,cache1,2,[food,student]},
 {server_state,cache2,1,[class]}]
22>
让我崩溃cache1,我们看看。
22> gen_server:cast(cache1,stop)。
好的
        缓存服务器:cache2 已接管表:来自服务器的食物:cache1
23>
        缓存服务器:cache2 已从服务器:cache1 接管表:学生
23> 缓存服务器:获取缓存状态()。
[{server_state,cache1,0,[]},
 {server_state,cache2,3,[student,food,class]}]
24>
同样,另一个:
24> gen_server:cast(cache2,stop)。
好的
        缓存服务器:cache1 已接管表:student from server:cache2
25>
        缓存服务器:cache1 已接管表:来自服务器的食物:cache2
25>
        缓存服务器:cache1 已接管表:来自服务器的类:cache2
25> 缓存服务器:获取缓存状态()。
[{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 回答