0

私は百万行以上の百万ファイルを読んでいます。

しかし、特定の文字列に対して通常の式を使用してそれらを置き換えようとしました。

私の文字列は( "tiger"、 "lion"、 "monkey")で、文字列"animal"に置き換えています。

正規表現置換を使用して達成しました

$line =~ s/tiger/animal/g;
$line =~ s/lion/animal/g;
$line =~ s/monkey/animal/g;

処理する場合、実行に時間がかかります。

ここで、なぜこれが遅いのか、そしてどうすればこの問題をより速く解決できるのかを理解したいと思います。

この問題を解決するために外部モジュールを使用できません。

4

3 に答える 3

5

正規表現の「コンパイル済み形式」を使用します。

my $regex = qr/\b(?:tiger|lion|monkey)\b/;

# in your loop:
$line ~= s/$regex/animal/g;

注: 正規表現は 1 つに削減され(?:...)、キャプチャされたテキストは使用されないため、非キャプチャ グループが使用されます。また、単語のアンカーが追加されました (たとえば、monkeyは一致しますが は一致しないことを意味しgreasemonkeyます)。複数形も置き換えたい場合s?は、最後の前に追加します。\b

ただし、これは正規表現の部分のみを処理します。他の種類の処理についても話します。おそらくプロセス全体を何らかの方法で変更して、最終的に高速化することができます。

于 2013-01-11T10:47:20.420 に答える
0

「100 万行を超える 100 万行以上のファイル」が何を意味するのかはよくわかりませんが、100 万個のファイルがあり、それぞれが 100 万行、たとえば 40 文字であるとします。これは 40 TB の情報になります。

データがハードディスク上にあり、たとえば 50MB/s で読み取る場合、この量のデータを読み取るには 40E12/50E6 = 800,000 秒、つまり 9 日強かかります。

プログラムが数時間で完了する場合は、非常に感謝する必要があります。

于 2013-01-11T12:35:52.383 に答える
0

3部の代わりにこれを行うこともできます。

$line=~s/(tiger|monkey|lion)/animal/g;
于 2013-01-11T10:54:16.480 に答える