我在脚本中做了一些时间戳打印,这篇文章花了太长时间:差不多5分钟就完成了...... !!!
fyi,strArr数组包含大约1500个字符串元素。 (这个循环多次运行)
文件tmp_FH_SR是27Mb和300,000行数据。 文件tmp_FH_RL为13 Mb,包含大约150,000行数据。
我已更改变量名称以保护实际名称......
在第一个while循环中,基于$ str在文件中只找到一次这一事实,我从匹配记录中获取另一个字段。我使用此字段在另一个文件中搜索此字段的出现次数。基于该输出,我将$ str添加到数组中。
my $tmp_srt;
foreach my $str (@strArr)
{
my $tmp1;
my $count=0;
seek $tmp_FH_SR,0,0;
while (<$tmp_FH_SR>)
{
my $line=$_;chomp($line);
if ($line=~ m/\"$str\"/)
{
$count++;
if ($count == 1)
{
my @tmp_line_ar = split(/\,/,$line);
$tmp_str=$tmp_line_ar[10];
}
}
}
if ($count == 1)
{
my $k;
seek $tmp_FH_RL,0,0;
while (<$tmp_FH_RL>)
{
my $line=$_;chomp($line);
if ($line=~m/\"$tmp_str\"/) {$k++;}
}
if($k == 1){push(@another_str_arr,$str);}
}
}
我怎样才能让它更快?一次读取阵列中的27mb和13mb文件并工作?我想避免这种情况,因为许多其他进程正在运行它的主机上运行。
TY。
答案 0 :(得分:7)
你正在倒退,这就是为什么花了这么长时间的一个原因。
@strAtt
只有1500个条目,并且由于你的循环,你正在阅读每个文件1500次。
将@strArr
中的entires放入地图中或使用多维数组,以便您可以跟踪每个条目的计数。从文件中读取一行,然后循环遍历1500个条目。您现在只读入一次文件。