Michelle Konzack wrote:
Am 2005-05-20 10:10:38, schrieb erkan yanar:

On Thu, May 19, 2005 at 04:27:39PM +0200, Helmut Wollmersdorfer wrote:

Ich bau derzeit an einem Filter mittels regex in Perl, der tausende Patterns auf Files mit Millionen Zeilen anwenden soll. Mein erster Ansatz mit den Testfiles (~2500 Patterns, ~3000 Zeilen) hat 4 min auf

Also bei meinen knapp über 600 benötige ich rund eine halbe Sekunde
mit procmail und BASH Script auf einem Sempron 2200 mit 256 MByte.

Für wieviele Zeilen? Perl würde in einer halben Sekunde etwa 20 - 50 tausend Match-Trials der einfachen Sorte "if ( $line =~ m/$regex/ )" abarbeiten können, wobei $line durchschnittlich 200 Characters lang ist, und $regex ein (relativ kurzer, 5 - 50 Character) String ist.

einem Athlon XP2500 gebraucht, nach Tuning 58 sec. Durch einen ausgefeilten Algorithmus bin ich jetzt auf 0.2 sec.

Kannst Du mal einen Verweis senden, wo man die Evolution deines Filters
nachvollziehen kann?

Ob Du es glaubst oder glaubst, mich würde das auch interessieren :-)

Wenn die Regex zum grossen Teil aus fixen Strings (z.B. Worte wie "Viagra", "buy", "free") bestehen, und die zu untersuchenden Daten einer gewissen Syntax folgen (z.B. "wort1 wort2, wort3: wort4"), dann speichert man die fixen Strings indiziert ab, und schaut mit $wort ganz einfach nach, ob es existiert. Das ist sehr schnell. Wenn es nicht in den fixen Strings existiert, dann durchläuft man die restlichen "echten Regex" (z.B. /f.{0,1}r.{0,1}(e.{0,1}){2}/i in einer Schleife.

Helmut Wollmersdorfer


--
Haeufig gestellte Fragen und Antworten (FAQ): http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject "unsubscribe". Probleme? Mail an [EMAIL PROTECTED] (engl)

Antwort per Email an