Perl中的并行计算

ars*_*had 2 perl

我想解析一个8 GB的文件来查找一些信息.这花了我超过4个小时才完成.我为此通过了perl Parallel :: ForkManager模块.但它并没有太大的区别.实现这个的更好方法是什么?

以下是用于解析此Jumbo文件的代码的一部分.我实际上有一个域名列表,我必须查看8 GB大小的区域文件,并找出它托管的公司.

    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;

    }
Run Code Online (Sandbox Code Playgroud)

FMc*_*FMc 6

一个基本的逐行解析通过1GB文件 - 例如,运行正则表达式或其他东西 - 在我5岁的Windows机器上只需几分钟.即使解析工作更广泛,4小时听起来像8GB数据的时间非常长.

您确定您的代码没有明显的低效率吗?您是否在解析期间存储了大量信息并且违反了RAM限制?CPAN具有允许您分析代码的工具,特别是Devel :: NYTProf.

在经历并行化代码的麻烦之前,请确保您了解瓶颈的位置.如果你解释你正在做什么,或者更好的是,提供以紧凑的方式说明问题的代码,你可能会得到更好的答案.