我在一门关于mapReduce算法的课程中有一个工作,所以我从一个大数据文件在Erlang中构建了一个ets表,我想同时处理它。结果表非常大,我想知道是否有办法将一个大表拆分为几个较小的表,以便我可以同时搜索该表使用mapReduce算法,有没有办法将一个大表拆分为子表???闷闷不乐。
您可以同时搜索 ETS 表,而无需拆分表:
http://www.erlang.org/doc/man/ets.html#new_2_read_concurrency
如果表格很大,我建议您使用良好的匹配模式来帮助减小搜索大小:http://www.erlang.org/doc/man/ets.html#select-2
我曾经开发过一个内部网应用程序,其中大部分时间我都必须将内容保存在 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 ebinEshell V5.9 (使用 ^G 中止)1> 应用程序:开始(缓存)。还行2> rd(学生,{姓名,年龄,性别})。学生3> cache_server:新(学生,套,2)。还行4> cache_server:write(#student{name = "Muzaaya Joshua", 性别 = "男性",年龄 = (2012 - 1987) })。还行5> cache_server:write(student,[#student{name = "Joe",= "Male"}, #student{name = "Mike",= "Male"}]).还行6> cache_server:read({student,"Muzaaya Joshua"}).[#student{姓名 = "Muzaaya Joshua",年龄 = 25,性别 = "男性"}]7> cache_server:read({student,"Joe"}).[#student{姓名 = "乔",年龄 = 未定义,性别 = "男性"}]8> cache_server:get_tables()。[{cache1,[student]},{cache2,[]}]9> rd(class,{class,no_of_students})..class10> cache_server:get_tables()。[{cache1,[student]},{cache2,[]}]11> cache_server:新(类,集,2).还行12> cache_server:get_tables().[{cache1,[student]},{cache2,[class]}]13> cache_server:写(类,[ #class{class = "Primary " ++ integer_to_list(N), no_of_students = 随机:均匀(50)} ||N <- lists:seq(1,7)]).还行14> cache_server:read({class,"Primary 6"}).[#class{类 = "小学六年级",no_of_students = 30}]15> cache_server:删除({class,"Primary 2"}).还行16> cache_server:get_cache_state().[{server_state,cache1,1,[student]}, {server_state,cache2,1,[class]}]17> rd(food,{name,type,value}).食物18> cache_server:新(食品,套餐,2).还行19> cache_server:write(food,[#food{name = "Orange", 类型 = "水果",值 = "维生素 C"}])。还行20> cache_server:get_cache_state().[{server_state,cache1,2,[food,student]}, {server_state,cache2,1,[class]}]21>现在,要了解
ets:give_away/3
的重要性,让我们看看当cache1
或cache2
崩溃时会发生什么。请记住,当前服务器状态(显示表的当前所有者)为: 21> cache_server:get_cache_state().[{server_state,cache1,2,[food,student]}, {server_state,cache2,1,[class]}]22>让我崩溃
cache1
,我们看到了。22> gen_server:投射(缓存1,停止)。还行 缓存服务器:缓存 2 已接管表:来自服务器的食物:缓存 123> 缓存服务器:缓存 2 已接管表:来自服务器的学生:缓存 123> cache_server:get_cache_state()。[{server_state,cache1,0,[]}, {server_state,cache2,3,[学生,食物,类]}]24>同样,另一个:
24> gen_server:cast(cache2,stop).还行 缓存服务器:缓存 1 已接管表:来自服务器的学生:缓存 225> 缓存服务器:缓存 1 已接管表:来自服务器的食物:缓存 225> 缓存服务器:缓存 1 已接管表:从服务器中的类:缓存 225> cache_server:get_cache_state().[{server_state,cache1,3,[类,食物,学生]}, {server_state,cache2,0,[]}]26>就是这样!您可以使用源代码中的概念自行创建一些内容。该库创建的
ETS
表是public
和named
的,因此您可以使用ETS
函数直接访问它们。