perl - 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;

    }

最佳答案

对一个 1GB 的文件进行基本的逐行解析——例如,运行正则表达式或其他东西——在我 5 岁的 Windows 机器上只需要几分钟。即使解析工作量更大,4 小时对于 8GB 的​​数据来说听起来也太长了。

您确定您的代码没有明显的低效率吗?您是否在解析过程中存储了大量信息并突破了 RAM 限制? CPAN 有一些工具可以让你分析你的代码,特别是 Devel::NYTProf .

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

https://stackoverflow.com/questions/3270928/

相关文章:

node.js - 为什么 bcryptjs 在 AWS Lambda 上比在本地 docker 上

proxy - JProfiler - 有防火墙时如何配置远程应用程序?

jboss - 更改 Velocity.Log 文件的位置

python - 如何在 Python 的特定范围内替换数据框中的数字?

macos - tmux没有在/private/tmp/tmux-502/default上运行的服务

macos - 检查签名工具失败并显示消息 : resource envelope is obsol

visual-studio-code - 如何在 visual studio 代码中显示完整的长行(

maven - Intellij IDEA 不更新 pom.xml 文件

javascript - JSON 到 XML 使用 Javascript

loops - JMeter while 循环(使用自己的索引停止循环)