- 浏览: 333382 次
- 性别:
- 来自: 北京
最新评论
-
perfect_control:
真的很详细,一些东西很容易被我忽略掉了
使用fprof进行性能分析 -
leeyisoft:
http://www.erlangqa.com/ 怎么变成 “ ...
Erlang问答网站,欢迎各位提出问题,解答问题。 -
simsunny22:
4年之后我才看到 慢慢的干货
Erlang服务器内存耗尽bug跟踪过程 -
爱死我:
...
使用etop查看系统中进程信息 -
宋兵甲:
在跑这个服务的时候,每秒建立一个客户端连接,连续建立10000 ...
自己写一个tcp 通用服务器
最近比较忙, 一来是在努力学习Erlang, 二来是恋恋不舍那几个开源的小项目,三来是熟悉亲爱的R13A...
加上令人头疼的公司的事情, 导致我很忙... 哎...
为了保持博客的新鲜度, 就贴一点充数的资料吧..呵呵...
在我前段时间搞的一个开源的mapreduce小框架中, 对于map, reduce数据流的读取, 我抽象出一个迭代器, 进行数据的读取.
这样我的数据无论来自local Disk, 来自memory, 来时NFS都一视同仁...
在写一个module之前,我先想象其接口及用法:
我们首先通过调用make_iter/3 构建一个迭代器, 第一个参数是一个函数用来获取前一条记录, 第二个参数用来获取下一条
记录. State是一个内部状态信息, 用来保存当前的状态.
构造好iter后, 我们可以通过调用prev/1, next/1 来遍历这个Iter.
这个实现,有点OO的感觉在里面, Iter可以理解为一个对象,其State为内部数据, prev_fun, next_fun为对应的方法.
为了让我们的iter模块更丰富,我们仿照lists module, 加入了foldl/3 和 foldr/3 两个函数.
当然还可以让这个iter功能更强大,比如是否可以循环迭代?是否可以双向或单向迭代?等等.有兴趣朋友可以实现哦.
好了,贴上代码:
最后是一个小例子, 我们定义一个迭代器,用来访问list, 当然这个做法似乎有点多此一举..
(这段代码摘自 iter 模块中的测试代码 )
好了就是这些, 有了这个module, 在mapreduce框架中,用户可以自定义各种的iter 实现, map, reduce会依据用户的iter
进行具体的数据读取,然后进行处理..
详细的代码, 请参考此处:
http://code.google.com/p/heng/source/browse/trunk/master/heng_iter.erl
加上令人头疼的公司的事情, 导致我很忙... 哎...
为了保持博客的新鲜度, 就贴一点充数的资料吧..呵呵...
在我前段时间搞的一个开源的mapreduce小框架中, 对于map, reduce数据流的读取, 我抽象出一个迭代器, 进行数据的读取.
这样我的数据无论来自local Disk, 来自memory, 来时NFS都一视同仁...
在写一个module之前,我先想象其接口及用法:
%%% usage: %%% Iter = make_iter(prev_fun, next_fun, State), %%% {Next , Iter2} = next(Iter), %%% {Next2, Iter3} = next(Iter2), %%% {Next, Iter2} = prev(Iter3).
我们首先通过调用make_iter/3 构建一个迭代器, 第一个参数是一个函数用来获取前一条记录, 第二个参数用来获取下一条
记录. State是一个内部状态信息, 用来保存当前的状态.
构造好iter后, 我们可以通过调用prev/1, next/1 来遍历这个Iter.
这个实现,有点OO的感觉在里面, Iter可以理解为一个对象,其State为内部数据, prev_fun, next_fun为对应的方法.
为了让我们的iter模块更丰富,我们仿照lists module, 加入了foldl/3 和 foldr/3 两个函数.
当然还可以让这个iter功能更强大,比如是否可以循环迭代?是否可以双向或单向迭代?等等.有兴趣朋友可以实现哦.
好了,贴上代码:
-module(heng_iter). -author('litaocheng@gmail.com'). -vsn('0.1'). -include("heng_master.hrl"). -export([make_iter/3]). -export([next/1, prev/1]). -export([foldl/3, foldr/3]). -record(iter, { %type = normal :: 'normal' | 'cyclic', % next = nil :: 'nil' | fun(), prev = nil :: 'nil' | fun(), state }). %% @doc get the next item next(#iter{next = nil}) -> {error, edirection}; next(Iter = #iter{next = Next, state = State}) -> case Next(State) of nil -> % to the end {nil, Iter}; {V, State2} -> {{value, V}, Iter#iter{state = State2}} end. %% @doc get the item in the backward prev(#iter{prev = nil}) -> {error, edirection}; prev(Iter = #iter{prev = Prev, state = State}) -> case Prev(State) of nil -> % to the end {nil, Iter}; {V, State2} -> {{value, V}, Iter#iter{state = State2}} end. %-spec foldl(Fun :: fun(), Acc :: term(), Iter :: iter()) -> % term(). foldl(Fun, Acc, Iter) when is_function(Fun, 2) -> {V, Iter2} = next(Iter), foldl0(Fun, Acc, V, Iter2). foldl0(_Fun, Acc, nil, _Iter) -> Acc; foldl0(Fun, Acc, {value, V}, Iter) -> Acc2 = Fun(V, Acc), {V2, Iter2} = next(Iter), foldl0(Fun, Acc2, V2, Iter2). foldr(Fun, Acc, Iter) when is_function(Fun, 2) -> {V, Iter2} = prev(Iter), foldr0(Fun, Acc, V, Iter2). foldr0(_Fun, Acc, nil, _Iter) -> Acc; foldr0(Fun, Acc, {value, V}, Iter) -> Acc2 = Fun(V, Acc), {V2, Iter2} = prev(Iter), foldr0(Fun, Acc2, V2, Iter2). %% @doc 'fward' equal 'forward' , 'bid' equal 'bidirectional' make_iter(Next, Prev, State) when is_function(Next) andalso is_function(Prev) %andalso ((Type =:= 'normal') or (Type =:= 'cyclic')) -> #iter{%type = Type, next = Next, prev = Prev, state = State }.
最后是一个小例子, 我们定义一个迭代器,用来访问list, 当然这个做法似乎有点多此一举..
(这段代码摘自 iter 模块中的测试代码 )
%% @doc some test basic_test_() -> Data = ["begin", "one", "two", "there", "four", "end"], ExpR1 = "begin one two there four end", ExpR2 = "end four three two one begin", %% 定义一个迭代器, 其调用listnext/1 获取下一条记录, 调用listprev/1 获取上一条记录, State为一个tuple %% 分别保存:数据的begin, last, length 和具体的数据(也就是list) Iter = make_iter(fun listnext/1, fun listprev/1, {0, 0, length(Data), Data}), R = ?MODULE:foldl(fun(Str, Acc) -> [Str, $ | Acc] end, [], Iter), Str = lists:flatten(lists:reverse(R)), % Str 为 ExpR1 Iter2 = make_iter(fun listnext/1, fun listprev/1, {length(Data)+1, 1, length(Data), Data}), R2 = ?MODULE:foldr(fun(E, Acc) -> [E, $ | Acc] end, [], Iter2), Str2 = lists:flatten(lists:reverse(R2)), % Str 为 ExpR2 [ ?_assert(Str = ExpR1), ?_assert(Str2 = ExpR2) ]. %% 用来获取下一条记录 listnext({Last, _First, Last, _Data}) -> nil; listnext({Pos, First, Last, Data}) -> Pos2 = Pos + 1, V = lists:nth(Pos2, Data), {V, {Pos2, First, Last, Data}}. %% 用来获取前一条记录 listprev({0, _First, _Last, _Data}) -> nil; listprev({First, First, _Last, _Data}) -> nil; listprev({Pos, First, Last, Data}) -> Pos2 = Pos - 1, V = lists:nth(Pos2, Data), {V, {Pos2, First, Last, Data}}.
好了就是这些, 有了这个module, 在mapreduce框架中,用户可以自定义各种的iter 实现, map, reduce会依据用户的iter
进行具体的数据读取,然后进行处理..
详细的代码, 请参考此处:
http://code.google.com/p/heng/source/browse/trunk/master/heng_iter.erl
发表评论
-
Erlang问答网站,欢迎各位提出问题,解答问题。
2012-03-18 15:07 5232平时收到很多关于Erlang的问题,我都尽量一一解答,可是时间 ... -
Emakefile并行编译
2011-11-17 13:15 7604项目代码越来越多,使用erlang编译也越来越慢。无论是Mak ... -
Erlang服务器内存耗尽bug跟踪过程
2011-10-25 21:44 21726本文描述朋友Erlang服务器内存耗尽bug的解决过程 ... -
inet:getstat/2小用法
2011-04-27 09:32 4549inet:getstat/2的用处 在 ... -
Erlang游戏开发-协议
2011-04-22 16:10 10680Erlang游戏开发-协议 ... -
Gearman Erlang Client
2010-10-17 21:14 3680Gearman Gearman是一个通用的任务调度框架。 ... -
ECUG归来
2010-10-17 21:02 2940今天ECUG V圆满结束了,不知不觉作为讲师已经参加过3次大会 ... -
gen-erl-app快速生成erlang app 框架
2010-04-07 14:22 3950经常需要创建各种erlang app,这个过程一旦掌握,就很繁 ... -
erl-redis发布
2010-03-30 11:44 5761最近几天因为需要,实现了一个redis erlang clie ... -
用Erlang做了很多事
2010-01-19 14:08 5041因为工作及时间关系,最近比较忙碌,没有太多的时间写文章。 ... -
ecug topic - erlang开发实践
2009-11-11 10:04 3717从ecug归来,感觉不错,大家学习探讨的积极性很高哦。 很高 ... -
reltool用户指南
2009-11-02 22:27 6304说明,最近比较忙,没有太多时间更新blog,请各位朋友谅解. ... -
Erlang定时任务server (仿crontab语法)
2009-09-23 18:03 6297好久不写blog了,看到yufeng老大那么活跃,我也“耐不住 ... -
Erlang进程之错?
2009-07-27 15:06 3655前阵子erlang-china关于erla ... -
CNode指南
2009-07-27 14:13 3289好久不发文章,因为工作太忙。这个东西就凑凑数吧。各位见谅。 ... -
Erlang类型及函数声明规格
2009-06-08 22:41 9485Erlang类型及函数声明 ... -
使用etop查看系统中进程信息
2009-05-29 13:57 6100Erlang提供了丰富的开发工具,你认为没有的时候,很可能是你 ... -
创建gen_server组解决单process瓶颈
2009-05-27 17:05 5217并发和顺序是一个令人 ... -
又有人投入Erlang的怀抱了:37Signals Campfire loves Erlang
2009-05-14 23:00 3581就喜欢看这样的东西... This is so juicy ... -
list random shuffle实现
2009-05-07 13:41 4321在项目中需要对list进行随机shuffle,但是在erlan ...
相关推荐
erlog, 在Erlang中,Prolog解释器 Erlog - 用于Erlang应用程序的PrologErlog是在Erlang中实现的Prolog解释器,并与Erlang运行时系统集成。 它是Prolog标准的子集。 还包括 Erlog shell ( REPL ) 。如
使用erlang语言实现连接ElasticSearch服务器的客户端代码
lambdapad, 使用Erlang的static 站点生成器 是的,Erlang LambdaPad Erlang power站点生成,仓库 !查看Lambda在 lambdapad.io 生成文档。 这是递归 !
Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此非常适 合于构建分布式,实时软并行计算系统。 使用Erlang编写出的应用运行时...
Erlang emulator 实现分析Erlang emulator 实现分析
erlang实现的网游服务器(OpenPoker系统)erlang实现的网游服务器(OpenPoker系统)erlang实现的网游服务器(OpenPoker系统)
一个用Python实现的Erlang结点,使用gevent库,努力同时与Python 2和Python 3兼容
erlang的timer和实现机制 Erlang程序设计
使用erlang进行UDP测试,这几个是为了凑够20字。
Erlang实现遗传算法,非常详细介绍了算法,这是一个非常难得一见的通俗易懂的好书
[奥莱理] 网络应用开发 (Erlang 实现) (英文版) [奥莱理] Building Web Applications with Erlang Working with REST and Web Sockets on Yaws (E-Book) ☆ 出版信息:☆ [作者信息] Zachary Kessin [出版机构] ...
二郎助手,专为erlang语言开发的开发工具。完全免费,源代码开源(VS2005开发)。
这个是平时工作中使用到的xml处理,使用的是erlang自带的方法加上自已的一个调整使用的,没找到可以选1分的地方
kmp游戏中使用频率较高,所以用erlang代码代码实现,效率还行。
rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统。它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rabbit MQ 是建立在Erlang OTP平台上。
erlang入门电子书 erlang编程 Introducing Erlang,作者Simon.St.Laurent
NULL 博文链接:https://pascal4123.iteye.com/blog/2077646
ErlangB和ErlangC计算工具(exe可执行文件+excel两个) ErlangB和ErlangC计算工具(exe可执行文件+excel两个)
Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此非常适 合于构建分布式,实时软并行计算系统。使用Erlang编写出的应用运行时...