Thread Effizienz bei Durchsuchen einer Datei nach mehreren Regex (5 answers)
Opened by Sven_123 at 2011-05-10 14:59

Sven_123
 2011-05-10 14:59
#148421 #148421
User since
2010-06-01
120 Artikel
BenutzerIn
[default_avatar]
Hallo,
ich bin gerade dabei ein Script zu schreiben, das log-Files, je nach Wunsch, nach verschiedenen Mustern durchsucht. Der Perl-Teil wird zeitlich am Ende so und so nicht ins Gewicht fallen, trotzdem interessiert mich, wie ich hier am besten programmiere. Um es ein bisschen konkret zu machen, sagen wir, es sind am Ende 200000 (zweihunderttausend) Zeilen, die die Dateien insgesamt haben, und ich habe maximal 10 Regex, nach denen in beliebigen Kombinationen gesucht werden soll.

Die programmiertechnisch am wenigsten aufwändige Methode wäre wohl:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
$reg1 = 1;
$reg2 = 0;
...

open my $dat, "< Datei" or die "Geht nicht :(\n";
while (<$dat>){
 if (($reg1) && (/^unleserliches\s+Konstrukt/)){...}
 if (($reg2) && (/xyz/)){...}
 ...
}


Ich hab mir noch nie ernsthaft Gedanken über die Zeiten gemacht, die so kleine Dinge wie ein "if" brauchen, bzw. in welcher Größenordnung sich die Anzahl der Aufrufe befinden muss, damit sich das bemerkbar macht...
Hier z.B. würden je nach angeschalteten Regex zwei- bis viermillionen Dinge überprüft (hört sich für mich viel an).
Man könnte das z.B. reduzieren, in dem man die Datei bei Bedarf für jede Regex einzeln durchsucht, da würden dann die zweimillionen "if ($regX)" durch 10 ersetzt. Andererseits machen die einfach if-Abfragen im Vergleich zur Überprüfung einer Regex wohl eh kaum was aus. Und der Code würde unübersichtlicher.

Sind die Zahlen hier in einer Größenordnung, wo solche Überlegungen sinnvoll werden, oder bin ich davon noch weit entfernt? Gibt es andere sinnvolle Konstrukte, oder ist der Perl-Interpreter sowieso klug genug, um die Abfragen auf $regX nicht jede Zeile zu wiederholen?

View full thread Effizienz bei Durchsuchen einer Datei nach mehreren Regex