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
Performance bei QTextStream::readLine()
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.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
Ganz grob sieht das so aus:
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).
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();
}
Code: Alles auswählen
...
inString = in.read();
...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).
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.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
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.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
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...
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...