[gelöst] Geschwindigkeit von QRegExp

Alles rund um die Programmierung mit Qt
Antworten
john
Beiträge: 110
Registriert: 14. August 2004 20:55
Wohnort: München

[gelöst] Geschwindigkeit von QRegExp

Beitrag von john »

Hallo Leute,

kann es sein, dass QRegExp sehr langsam ist? Ich habe eine TextDatei zeilenweise einzulesen und diverse Informationen daraus zu ziehen. Funktioniert eigentlich auch einwandfrei!

Die Datei hat gute 60.000 Zeilen und ist ca. 6 MB groß. Das einlesen der Datei geht sehr schnell! Die Werte ziehe ich mit dem langen Regulären Ausdruck raus und speichere diese in einer doppelt verketteten Datenstruktur ab. Also, die Struktur hat dann auch ca. 60.000 Elemente, da der Reguläre Ausdruck eigentlich auf jede Zeile matcht.

Die Schleife in der der Reguläre Ausdruck auf jede Zeile ausgeführt wird braucht ewig, ca. 3 Minuten. Das ist der Flaschenhals. Das einlesen der Datei geht in ms. Ebenso das komplette durchlaufen der Datenstruktur.

Hier mal den Code-Ausschnitt, der so lange braucht (bzw. wie ich den QRegExp verwende):

Code: Alles auswählen

	QRegExp rx(".*\\d+,(-?\\d{1,3}),(-?\\d{1,3}),\\d+,\\d+,'([^']*)',(\\d+),'([^']*'),(\\d+),'([^']*'),(\\d+)");
	QTextStream stream;
	QFile file(fileName);
	QPoint koord;
	
	if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
		qWarning() << "Fehler beim öffnen der Datei!";
		return;
	}
	
	while(stream.atEnd() == false) {
		line = stream.readLine();
		if(rx.indexIn(line) != -1) {
			koord.setX(rx.cap(1).toInt());
			koord.setY(rx.cap(2).toInt());
			...
			...
			...
		}
	}
Hab ich da irgendein Fehler drin oder löse ich das zu umständlich? Oder ist QRegExp wirklich langsam?

Vielen Dank für jeden Hinweis!

LG john
Zuletzt geändert von john am 1. November 2008 23:50, insgesamt 1-mal geändert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

RegEx sind langsam. Wobei mir Qt in diesem Fall wirklich sehr langsam vorkommt.

Ich würde die Zeilen mittels QString::split(",", ...) aufteilen und dann die einzelnen Teile mit kleineren RegEx überprüfen. Dies scheint die Sache etwas zu beschleunigen.
john
Beiträge: 110
Registriert: 14. August 2004 20:55
Wohnort: München

Beitrag von john »

danke upsala, für den sehr guten Tipp (QString::split())!

Jetzt habe ich:

Code: Alles auswählen

while(stream.atEnd() == false) {
		line = stream.readLine();
		QStringList temp = line.split(",");
		for(int i = 0; i < temp.size(); ++i) {
			switch(i) {
				case 1: //X
					koord.setX(temp.at(i).toInt());
				break;
				case 2: //Y
					koord.setY(temp.at(i).toInt());
				break;
				...
				...
				...
			}
		}
geht aber leider nicht wirklich schneller. Beide Lösungen funktionieren, aber leider recht langsam.

Trotzdem Danke!

Lg john

PS.: bei der Lösung mit QString::split() habe ich keinen RegEx mehr verwendet. Braucht aber genauso lang.
john
Beiträge: 110
Registriert: 14. August 2004 20:55
Wohnort: München

Beitrag von john »

Hallo nochmals,

sry, ich hab was übersehen. Ich hab alles mitgemessen und es kam bei der Lösung mit QRegEx raus:
60841 Einträge, Time elapsed: 3375 ms

bei der Lösung mit QString::split() (danke upsala):
60841 Einträge, Time elapsed: 860 ms

Also QRegEx sind wirklich langsam, aber besser als die 3 min^^

Vielen DanK!

LG john
Antworten