Seite 1 von 1
Performance bei QTextStream::readLine()
Verfasst: 16. August 2007 10:33
von iaby
Hallo zusammen,
Wenn ich ein Textfile mit 20MB Größe über readLine() einlese, dann dauert das ca. 10 Sekunden.
Das gleiche über read() dauert hingegen nur etwa 0,7 Sekunden!
Ich brauche allerdings immer eine ganze Zeile! Kennt noch jemand einen Trick um das zu beschleunigen?
Wieso ist die Performance überhaupt so unterschiedlich? Bei read() prüft er eben auf ein Leerzeichen und bei readLine() auf einen Zeilenumbruch, dürfte doch eigentlich fast kein Unterschied machen, oder?
Gruß,
iaby
Verfasst: 16. August 2007 14:54
von macman
Ohne Code kann man da nicht viel zu sagen. Und wieso prüft er bei read auf ein Leerzeichen? Du gibst doch an wieviel er lesen soll.
Verfasst: 16. August 2007 15:21
von iaby
Ganz grob sieht das so aus:
Code: Alles auswählen
QFile file("/home/ich/test.txt");
file.open(QIODevice::ReadOnly | QIODevice::Text);
QString inString;
QTextStream in(&file);
in.setCodec("UTF-8");
while (!in.atEnd()) {
inString = in.readLine();
}
wohingegen
viel schneller ist!
Liefert read() nicht einen String bis zum nächsten Leerzeichen zurück? Hatte ich so irgendwie im Kopf, in der Doku steht dazu aber tatsächlich nix ?: Der int-Wert der da übergeben wird verstehe ich so, dass es die maximale Anzahl Zeichen ist (also falls dann kein Leerzeichen zwischen drin auftaucht).
Verfasst: 16. August 2007 15:31
von macman
Das erste sieht ok aus, beim zweiten fehlt mir der Parameter. Wie groß ist der denn? Die Doku lese ich so, das read(n) n Zeichen liest, egal was kommt. Wenn Du als n 1024 angegeben hast, dann ist er nach 20 Durchläufen fertig. Wenn da aber 1000 Zeilen drin stehen, dann dauert es eben 50mal länger.
Verfasst: 17. August 2007 08:40
von iaby
Ja das stimmt laut Doku forder read(int) zwingend einen Parameter!
Ich schau mir das ganze nochmal an wenn ich wieder daheim bin. Bin mir aber relativ sicher dass ich read() ohne einen Parameter benutzt habe...

Verfasst: 20. August 2007 14:53
von iaby
Also read ohne Parameter liefert mir die ganze Datei zurück!
Werde ich wohl bei meinem readLine() bleiben müssen, obwohl mir das schon etwas zu langsam geht

Verfasst: 20. August 2007 15:07
von macman
Wie sieht es denn aus wenn Du die ganze Datei liest und den String dann splittest? Könnte schneller sein, wenn Du den Zeilentrenner kennst. In den meisten Fällen sollte man mit '\n' zurecht kommen. Wenn es fühlbar schneller ist, solltest Du eine Dateigröße bestimmen bis zu der Du so verfährst.
Verfasst: 20. August 2007 16:17
von iaby
Ja die Dateigröße ist eben dann mein Problem!
Wenn diese größer ist als das freie RAM, ist mein kompletter Vorteil dahin weil er auf die Festplatte auslagert!
Ich kann ja mal ein paar Test machen und alles kleiner als 10 - 50MB mit split() verarbeiten. Wobei er dann eben 2 * (10 - 50) MB benötigt!
Mal schauen, alles irgendwie nicht so optimal...