0

スクリプト内からいくつかのタイムスタンプ プリントを実行しましたが、この作業には時間がかかりすぎます。完了するまでに約 5 分かかります...!!!

参考までに、strArr 配列には約 1500 個の文字列要素が含まれています。(このループは何度も実行されます)

ファイル tmp_FH_SR は 27Mb で 300,000 行のデータです。ファイル tmp_FH_RL は 13 Mb で、約 150,000 行のデータがあります。

実際の名前を保護するために変数の名前を変更しました...

最初の while ループでは、$str がファイル内で 1 回だけ見つかったという事実に基づいて、一致するレコードから別のフィールドを取得します。このフィールドを使用して、別のファイルでこのフィールドが出現する回数を検索します。その出力に基づいて、配列に $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 のファイルを 1 回読み取って動作しますか? これが実行されているホストで他の多くのプロセスが実行されているため、それを避けたかったのです。

タイ。

4

1 に答える 1

7

これが、時間がかかる理由の 1 つです。

@strAttはわずか 1500 エントリであり、ループのために各ファイルを 1500 回読み取っています。

全体をマップに入れる@strArrか、多次元配列を使用して、各エントリのカウントを追跡できるようにします。ファイルから 1 行を読み取り、1500 エントリをループします。ファイルを 1 回だけ読み込むようになりました。

于 2012-08-20T23:03:45.800 に答える