Параллельные вычисления в Perl - PullRequest
2 голосов
/ 17 июля 2010

Я хочу проанализировать 8 ГБ файл, чтобы найти некоторую информацию. Это займет у меня более 4 часов, чтобы закончить. Я прошел через Perl Parallel :: ForkManager модуль для этого. Но это не имеет большого значения. Каков лучший способ реализовать это?

Ниже приведена часть кода, используемая для анализа этого файла Jumbo. У меня фактически есть список доменов, которые я должен посмотреть в файле зоны размером 8 ГБ и выяснить, в какой компании он находится.

    unless(open(FH, $file)) {
        print $LOG "Can't open '$file'  $!";
        die "Can't open '$file'  $!";
    }

    ### Reading Zone file : $file
    DOMAIN: while(my $line = <FH> ){

        #domain and the dns with whom he currently hosted
        my($domain, undef, $new_host) = split(/\s|\t/, $line);
        next if $seen{$domain};
        $seen{$domain} =1;

        $domain.=".$domain_type";
        $domain = lc ($domain);


        #already in?
        if($moved_domains->{$domain}){

            #Get the next domain if this on the same host, there is nothing to record 
            if($new_host eq $moved_domains->{$domain}->{PointingHost}){
                next DOMAIN;
            }
            #movedout
            else{
                @INSERTS = ($domain, $data_date, $new_host, $moved_domains->{$domain}->{Host});
                log_this($data_date, $populate, @INSERTS);
            }
            delete $moved_domains->{$domain};
        }
        #new to MovedDomain
        else{
            #is this any of our interested HOSTS
            my ($interested) = grep{$new_host =~/\b$_\b/i} keys %HOST;

            #if not any of our interested DNS, NEXT!
            next DOMAIN if not $interested;
            @INSERTS = ($domain, $data_date, $new_host, $HOST{$interested});
            log_this($data_date, $populate, @INSERTS);

        }
        next DOMAIN;

    }

Ответы [ 2 ]

6 голосов
/ 17 июля 2010

Базовый проход построчного анализа файла размером 1 ГБ - например, запуск регулярного выражения или чего-то подобного - занимает всего пару минут на моем 5-летнем компьютере с Windows. Даже если работа по анализу является более обширной, 4 часа звучат как ужасно большое время для 8 ГБ данных.

Вы уверены, что в вашем коде нет явной неэффективности? Вы храните много информации во время разбора и увеличения вашей памяти? CPAN имеет инструменты, которые позволят вам профилировать ваш код, в частности Devel :: NYTProf .

Прежде чем приступить к распараллеливанию вашего кода, убедитесь, что вы понимаете, где находится узкое место . Если вы объясните, что вы делаете, или, что еще лучше, предоставите код, который иллюстрирует проблему в сжатой форме, вы можете получить лучшие ответы.

4 голосов
/ 17 июля 2010

С небольшой информацией, которую вы дали: Parallel::ForkManager звучит как подходящий инструмент. Но вы, вероятно, получите лучшую помощь, если подробно расскажете о своей проблеме.

Распараллеливание всегда трудная проблема. То, сколько вы можете надеяться получить, во многом зависит от характера задачи. Например, вы ищете конкретную строку в файле? Или конкретная запись фиксированного размера? Или все куски, которые соответствуют определенному битовому шаблону? Обрабатываете ли вы файл от начала до конца, или вы можете пропустить некоторые части, или вы делаете много перетасовок назад и вперед? и т.д.

Является ли файл 8 ГБ абсолютным ограничением, или вы можете реорганизовать данные, чтобы их было легче найти?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...