Große Dateien parallel zeilenweise parsen.
Verfasst: 4. März 2010 14:59
Hallo.
Ich habe große Text-Dateien die ich einlesen und Parsen will. Das Parsen ist ganz simpel, in jeder Zeile stehen n Integers oder Doubles als Klartext, und ich will das in Doubles konvertieren. Das funktioniert auch schon alles, hab auch schon ne Funktion die ein QByteArray nimmt und entsprechend verwurstet.
Mein Problem: Ich würde gerne mehrere Zeilen auf einmal (parallel) parsen, denn das Ganze dauert gerne auch mal seine 3 Minuten bei 100% Auslastung auf einem Core. Das ganze sollte möglichst so ablaufen, dass er sobald ein Platz im globalen ThreadPool frei ist die nächste Zeile einlesen und in nem Thread parsen soll (Erst alles einlesen und dann mit QtConcurrent::mapped() parsen will ich vermeiden, weil ich nicht unbedingt 500MB Speicher für die Liste mit QByteArrays verpulvern will.)
Ich hab das dann mal mit nem einfachen Loop und QtConcurrent::run() probiert, aber das scheint nicht darauf ausgelegt zu sein und läuft mit 80-95% Auslastung auf allen Kernen (Dualcore) langsamer als der Serielle Ansatz mit 100% auf einem Kern. Oo
Verzweifelte Versuche den Overhead zu minimieren wie z.B. in nem Dauerloop immer nur dann run() aufzurufen wenn ein Platz im Threadpool frei ist oder immer nur maxThreads auf einmal zu starten und dann jedesmal warten bis alle Fertig sind bevor die nächsten gestartet werden haben natürlich alles nur noch schlimmer gemacht.
Was meint Ihr, kann man das irgendwie hinkriegen dass immer nur eine Zeile gelesen wird wenn ein Thread zum Parsen bereit steht oder muss ich doch ein 500MB File cachen nur um maped() verwenden zu können?
Ich habe große Text-Dateien die ich einlesen und Parsen will. Das Parsen ist ganz simpel, in jeder Zeile stehen n Integers oder Doubles als Klartext, und ich will das in Doubles konvertieren. Das funktioniert auch schon alles, hab auch schon ne Funktion die ein QByteArray nimmt und entsprechend verwurstet.
Code: Alles auswählen
while (!file.atEnd()) {
parseLine(file.readLine(), ++lineNr);
}
// ca. 14,5 Sekunden für 1 Mio Zeilen mit jeweils drei ZahlenIch hab das dann mal mit nem einfachen Loop und QtConcurrent::run() probiert, aber das scheint nicht darauf ausgelegt zu sein und läuft mit 80-95% Auslastung auf allen Kernen (Dualcore) langsamer als der Serielle Ansatz mit 100% auf einem Kern. Oo
Code: Alles auswählen
while (!file.atEnd()) {
QtConcurrent::run(this, &Loader::parseLine, file.readLine(), ++lineNr);
}
// ca. 23,5 Sekunden für 1 Mio Zeilen mit jeweils drei ZahlenWas meint Ihr, kann man das irgendwie hinkriegen dass immer nur eine Zeile gelesen wird wenn ein Thread zum Parsen bereit steht oder muss ich doch ein 500MB File cachen nur um maped() verwenden zu können?