【发布时间】:2011-05-29 05:09:29
【问题描述】:
我正在尝试在 Erlang 中创建一个多线程(?)程序:
- 读取大文件 (600mb)
- 向一组创建的进程触发消息,其中包含从文件中读取的行
- 创建的进程处理单词并存储在哈希树中
- 创建的进程然后将哈希树返回给主进程
- master 打印树。
到目前为止,我想我已经完成了前三个...我无法弄清楚如何通过在每次插入时打印出每个密钥哈希对来测试我的树。
主线程:
-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.
感谢您的帮助。
【问题讨论】:
标签: erlang count word parallel-processing