我在使用 mapReduce 算法的课程中工作,所以我从一个大数据文件在 Erlang 中构建了一个 ets 表,我想同时处理它。结果表很大,我想知道是否有办法将一个大表拆分为几个较小的表,以便我可以使用 mapReduce 算法同时搜索表,有什么方法可以拆分一个大表表变成子表???谢谢。
问问题
233 次
2 回答
1
我曾在一个 Intranet 应用程序上工作过,在该应用程序中,我大部分时间都必须将内容保存在 RAM 中。我创建了一个马厩caching library
,帮助我抽象了这些ETS
机制。在这个库中,我为工作人员gen_servers
创建、拥有和公开ETS
表的方法。我将它们命名为:cache1
和cache2
。这两个继续以冗余的方式将所有权转移给对方,以防其中一个出现问题。获取应用程序: 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
,让我们看看当cache1
orcache2
崩溃时会发生什么。请记住,当前服务器状态(显示表的当前所有者)是: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 回答