如何使这个perl更快地循环

时间:2012-08-20 22:58:03

标签: perl while-loop

我在脚本中做了一些时间戳打印,这篇文章花了太长时间:差不多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。

1 个答案:

答案 0 :(得分:7)

你正在倒退,这就是为什么花了这么长时间的一个原因。

@strAtt只有1500个条目,并且由于你的循环,你正在阅读每个文件1500次。

@strArr中的entires放入地图中或使用多维数组,以便您可以跟踪每个条目的计数。从文件中读取一行,然后循环遍历1500个条目。您现在只读入一次文件。