我想解析一个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)
一个基本的逐行解析通过1GB文件 - 例如,运行正则表达式或其他东西 - 在我5岁的Windows机器上只需几分钟.即使解析工作更广泛,4小时听起来像8GB数据的时间非常长.
您确定您的代码没有明显的低效率吗?您是否在解析期间存储了大量信息并且违反了RAM限制?CPAN具有允许您分析代码的工具,特别是Devel :: NYTProf.
在经历并行化代码的麻烦之前,请确保您了解瓶颈的位置.如果你解释你正在做什么,或者更好的是,提供以紧凑的方式说明问题的代码,你可能会得到更好的答案.