Thread Performance Problem mit Perl bei RegEx (34 answers)
Opened by nomoresecrets at 2009-05-11 17:16

topeg
 2009-05-11 17:56
#121454 #121454
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
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...

View full thread Performance Problem mit Perl bei RegEx