Я пытаюсь создать многопоточную (?) Программу на Erlang, которая:
- Читает в большом файле (600 МБ)
- Отправляет сообщения группе созданных процессов, содержащих строки, прочитанные из файла
- Созданные процессы обрабатывают слово и сохраняют в хэш-дереве
- созданный процесс затем запускает хэш-дерево обратно к мастеру
- Мастер печатает дерево.
Пока, я думаю, что я выполнил первые три ... Я не могу понять, как проверить свое дерево, распечатывая каждую пару ключ-хэш каждый раз, когда они вставляются.
Основная нить:
-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.
Спасибо за вашу помощь.