Thread Performance Problem mit Perl bei RegEx
(34 answers)
Opened by nomoresecrets at 2009-05-11 17:16 Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #/usr/bin/perl use strct; use warnings; my $file='C:\myfile.txt'; # regexp vorkompilieren my $regexp=qx/CP_NG/o; # vernünftige Fehlermeldung open(TRACEFILE, '<', $file ) or die "cannot open $file $!\n"; # vor der Schleife definieren # das redefine in der Schleife bremst aus my $found=0; my $in_line; while ($in_line = <TRACEFILE>) { # du willst doch alle Treffer in einer Zeile nicht nur einen oder? $found += $in_line =~ m/$regexp/g; } print "anzahl treffer: $found\n"; Etwas schneller denke ich... Nachteil: es könnte der gesuchte String zerschnitten werden... dagegen gäbe es Abhilfe die aber ein wenig komplizierter ist. Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #/usr/bin/perl use strct; use warnings; my $chuncksize=10*1024*1024; # 10MB je größer je schneller my $file='C:\myfile.txt'; my $regexp=qx/CP_NG/o; open(TRACEFILE, '<', $file ) or die "cannot open $file $!\n"; my $found=0; my $chunk; while (read(TRACEFILE, $chunk, $chuncksize)) { $found += $chunk =~ m/$regexp/g; } print "anzahl treffer: $found\n"; Mit Überschneidung: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #/usr/bin/perl use strct; use warnings; my $shared=100; # 100 Zeichen Überschneidung my $chuncksize=10*1024*1024; my $file='C:\myfile.txt'; my $regexp=qx/CP_NG/o; open(TRACEFILE, '<', $file ) or die "cannot open $file $!\n"; my $found=0; my $chunk; my $old; while (read(TRACEFILE, $chunk, $chuncksize)) { $chunk=$old+$chunk; $found += $chunk =~ m/$regexp/g; $old=substr($chunk,-$shared,$shared); $old =~ s/$regexp//g; } print "anzahl treffer: $found\n"; Man müsste testen was schneller ist... |