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

nomoresecrets
 2009-05-11 17:16
#121447 #121447
User since
2009-05-11
8 Artikel
BenutzerIn
[default_avatar]
Hallo Leute,

habe ein kleines Problem und vllt kann mir wer einen Tipp geben!?

Meine Umgebung sieht in etwa so aus:

* ich habe ein txt-file mit ~1,5GB Größe
* ich suche einen festen String (später dann auch variable, bzw Strings wo ich einfach regex brauch um sie zu beschreiben)
* ich zähle die Treffer mit
* ich gebe die Trefferanzahl aus

das Ganze habe ich in Perl und Java (nich schlagen, war eher aus Interesse um belegen zu können wie toll doch Perl ist) umgesetzt

Quellcode siehe Links weiter unten.

Mein Problem ist nun, dass Java ~30% schneller ist wenn ich regex nehme und wenn ich die Methode contains nutze, dann sogar 10x so schnell wie mein Perlscript.

Das kann doch irgendwo nicht sein oder?

Ich hab auch schon mit direktem Stringvergleich, Substringvergleich, index und diversen regex-flags rumprobiert, aber es wird einfach nicht besser :(

Da das Programm später 100+GB Textfiles durchforsten muss, ist auch nur der geringste Performanceschub wichtig für mich.

hier die beiden Quellcodes:

Perl hat eine Laufzeit von ca 4min30s, das Java-Ding mit Regex ~3min und mit contains nur ~35s

Hat wer eine Idee warum Perl so extrem langsam ist?

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
open TRACEFILE, "<C:\\myfile.txt" or die "cannot open tracefile";
my $found=0;
while (!eof TRACEFILE) {
        $in_line = <TRACEFILE>;    # lese aktuelle Zeile ein
        chomp($in_line);
        if ($in_line =~ m/CP_NG/) {
                $found++;
        }
}
print "anzahl treffer: $found\n";


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.io.BufferedReader;
import java.io.FileReader;

public class Test {
public static void main(String[] args) {
int found=0;
try {
BufferedReader reader = new BufferedReader(new FileReader("c:\\myfile.txt"));
String line;
while ((line = reader.readLine()) != null) {
// if (line.contains("CP_NG")) {
// found++;
// }
if (line.matches(".*CP_NG.*")) {
found++;
}
}
reader.close();
}
catch (Exception e) {
e.printStackTrace();
}
System.out.println("anzahl treffer:"+found);
}
}


Vielen Dank schonmal

Grüße

nms

View full thread Performance Problem mit Perl bei RegEx