我想解析一个 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 - 有防火墙时如何配置远程应用程序?
python - 如何在 Python 的特定范围内替换数据框中的数字?
macos - tmux没有在/private/tmp/tmux-502/default上运行的服务
macos - 检查签名工具失败并显示消息 : resource envelope is obsol
visual-studio-code - 如何在 visual studio 代码中显示完整的长行(
maven - Intellij IDEA 不更新 pom.xml 文件