Erlang字计数器
|
我正在尝试用Erlang编写一个多线程(?)程序,该程序是:
读取大文件(600mb)
向包含已从文件读取的行的一组已创建进程发送消息
创建的进程处理单词并将其存储在哈希树中
创建的过程然后将哈希树激发回主节点
大师打印树。
到目前为止,我想我已经完成了前三个工作...我无法弄清楚如何在每次插入键/哈希对时打印出每个键/哈希对来测试我的树。
主线程:
-module(lineread).
-export([read/1]).
read(Wordlength) ->
{ok, Input} = file:open(\"/home/ml/datasets/tweets/first60kTweets.txt\", [read]),
Threads = makeThreads(Wordlength),
read_lines(Input, Threads).
read_lines(Input, Threads) ->
case file:read_line(Input) of
eof ->
file:close(Input);
{ok, Line} ->
send_to_all(Threads, Line),
read_lines(Input, Threads)
end.
send_to_all(Threads, Line) ->
lists:foreach(fun(Pid) ->
Pid ! {line, Line} end,
Threads).
makeThreads(NumThreads) ->
[ spawn(counter, run, [N]) || N <- lists:seq(1, NumThreads) ].
其他线程:
-module(counter).
-export([run/1]).
%%entry point for the code
run(K) ->
loop(K, gb_trees:empty()).
%%loops for a recieved message
loop(Size, Tree) ->
receive
{line, Line} ->
%%io:format(\"~p~n\", [Line]),
Splits = re:split(Line, \" \"),
NewTree = build_tree(Splits, Tree),
loop(Size, NewTree);
{char, Char} ->
io:format(\"~p\", [Char])
%%loop(Size, )
end.
%%puts the data into a Tree...
build_tree([], Tree) ->
Tree;
build_tree([W|R], Tree) ->
case gb_trees:is_defined(W, Tree) of
true ->
I = gb_trees:get(W, Tree),
NewTree = gb_trees:update(W, I + 1, Tree),
io:format(I),
build_tree(R, NewTree);
false ->
NewTree = gb_trees:insert(W, 1, Tree),
%%io:format(\"~p/~n\"),
build_tree(R, NewTree)
end.
谢谢你的帮助。
没有找到相关结果
已邀请:
3 个回复
献导外拘
,因此所有进程都是相同的。 目前尚不清楚为什么要产生任何东西。生成W进程并将每一行发送给所有进程是一个陷阱-由于IO开销(与发送到每个进程时必须复制文本相比),这最终会比不产生新进程慢得多。您最终将在它们之间发送类似(W)(600MB)(2)的内容。 kes。 您可能想要一个字典或一个命令而不是一个gb树。参见dict:update_counter / 3。另请参阅此以获取更多详细信息。使用ets表可能很有意义,但是我不确定目标是什么。 在这种情况下,应使用string:tokens / 2而不是re:split / 2-对于简单的空格分割,您不需要re的开销。
粳饶瓢部
撵穆