Seite 1 von 1

[gelöst] Geschwindigkeit von QRegExp

Verfasst: 1. November 2008 20:15
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

Verfasst: 1. November 2008 21:31
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.

Verfasst: 1. November 2008 22:32
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.

Verfasst: 1. November 2008 23:47
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