Новичок карте/уменьшить слово частотомер


Я представляю вам мой первый модуль, чтобы узнать некоторые Эрланг ждут вашего внимания . Это слово подсчете частоты через карту/уменьшить . Я Эрланг нуб, поэтому очень хотелось бы отзывы о:

Ненужные подробности / код

Ошибки в стиле Эрланга''

Вещи, которые можно сделать более элегантно

-module(main).

-export([map/1]).
-export([main/0]).
-export([reducer_wrapper/1]).
-export([reducer/2]).

-define(NUMBER_OF_PARTITIONS, 100).

main() ->
    Lines = readlines('pg20417.txt') ,
    lists:foreach( fun main:map/1, Lines ),
    start_reduce().

%% signals all reducer_wrappers that all emits are received, and the actual reduce can be started
start_reduce() ->
    lists:foreach( fun(PartitionNr) -> get_reducer(PartitionNr) ! start_reduce end, lists:seq(1, ?NUMBER_OF_PARTITIONS) ).

%% emits every word with cnt = 1
map(Line) ->
    Words = string:tokens( string:to_lower(Line), " .,;:\n()?"),
    lists:foreach ( fun(Word) -> get_reducer( Word, ?NUMBER_OF_PARTITIONS ) ! {emit, {Word, [1]}} end, Words ).

%% returns the reducer Pid
get_reducer( PartitionNr ) ->
    ProcessName = list_to_atom( lists:concat( [PartitionNr, '_reducer'] ) ),
    case whereis( ProcessName ) of
    undefined ->
        Pid = spawn(?MODULE, reducer_wrapper, [[]]),
        register( ProcessName, Pid ),
        Pid;        
    Pid -> 
        Pid
    end.

get_reducer( Key, NumberOfPartitions ) ->
    get_reducer(  erlang:phash2(Key) rem NumberOfPartitions + 1 ).

%% the reducer wrapper proces
reducer_wrapper(KeyValueTuples) ->
    receive
    { emit, KeyValueTuple } ->
        reducer_wrapper( [KeyValueTuple] ++ KeyValueTuples );
        start_reduce ->
        Dictionary = lists:foldl( fun main:reducer/2, dict:new(), KeyValueTuples ),
        show_all( dict:to_list(Dictionary) )
    end.

reducer( { Key, [Cnt] }, Dictionary ) ->
    case dict:is_key( Key, Dictionary ) of
    true ->
        dict:store( Key, dict:fetch( Key, Dictionary ) + Cnt, Dictionary );
    false ->
        dict:store( Key, Cnt, Dictionary )
    end.

readlines(FileName) ->
    {ok, Device} = file:open(FileName, [read]),
    get_all_lines(Device, []).

get_all_lines(Device, Accum) ->
    case io:get_line(Device, "") of
        eof  -> file:close(Device), Accum;
        Line -> get_all_lines(Device, Accum ++ [Line])
    end.

show_all([Head|Tail]) ->
        io:format("~p~n", [Head]),
        show_all(Tail);

show_all([]) ->
        void.


1024
5
задан 13 апреля 2011 в 10:04 Источник Поделиться
Комментарии
1 ответ

Несколько начальных точек:


  • Фазы mapping-это все сделано на одном процессе, так что вы не получаете никакого параллелизма. Ты должен выстрелить м картографов, чтобы сделать отображение для вас, и дать им биты данных карты. Они могут передать это одна из Р редукторы, которые делают сокращение.

  • [KeyValueTuple] ++ KeyValueTuples медленно, как вы создаете списки и соединяя их вместе. Вместо этого, просто добавить значения в список за O(1) времени: [KeyValueTuple|KeyValueTuples]

  • Как ты нереста/создание процесс редуктор-это немного лишнее. Если бы я был тобой, я бы отродясь Р редукторы спереди и блюдо из Работа в циклическую. Это даст вам лучший контроль распределения нагрузки.

  • Вместо того, чтобы позвонить дикт:is_key тогда, если правда, называя дикт:принести сделать их обоих в один шаг, позвонив дикт:найти, то совпадение с {OK, значение} или ошибки. Это экономит на двойной подстановки.

В качестве общего замечания, вы очень связали воедино оба карту/уменьшить и счетные слова. В идеале то, что вы хотите сделать, это иметь структуру/модуля, который знает о том, как сделать карту/уменьшить сам по себе, и быть невежественным в работу, что происходит. Тогда вам придется еще один модуль, который способен вызвать карту/уменьшить работу, передавая в функцию map, функция reduce, количество преобразователи и редукторы и данные, которые обрабатываются.

Я понимаю, что вы учитесь, так что вам не нужно делать все это. Но вниз по дорожке я рекомендую пытаясь абстрагироваться карте/уменьшить материал в модуль многоразовый.

Надеюсь, что помогает.
ОЖ

ПС. вы надеялись на кого-то, чтобы показать вам, как они код его? Я новичок в этом сайте код ревью и я не уверена стоит ли мне выкладывать "фиксированный" код или нет :)

5
ответ дан 15 апреля 2011 в 01:04 Источник Поделиться