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