C++ Multithreading Performance Problem

  • Gude allerseits,


    um mein Problem erklären zu können, folgt erstmal die Beschreibung meines derzeitigen Projekts.

    Einigen unter euch wird möglicherweise die Seite "mtaupload.com" etwas sagen. Diese Seite ist langsam des Grauens und macht mich wahnsinnig. Deshalb möchte ich eine eigene Lösung implementieren, wofür ich eine Datenbank brauche.

    Das Projekt, mit dem ich diese Datenbank anfertige, möchte ich der Community zur Verfügung stellen.


    Dort habe ich mir jetzt etwa 6700 Maps per Script heruntergeladen (natürlich mit Einverständnis der Administration).

    Da es ein Haufen an Maps ist und man da sehr schnell den Faden verliert, habe ich natürlich auch ein Programm geschrieben, welches das Archiv nach der meta.xml durchsucht und anschließend den Mapnamen + den Pfad in eine .json-Datei schreibt.

    Hier kommen wir zum Problem: Solche intensiven IO-Zugriffe sorgen für ordentlich Lag, weshalb ich das Programm auf Multithreading umgeschrieben habe. Der 9:30 Minuten Prozess dauert nun nurnoch knapp 2 Minuten, was wirklich deutlich schneller ist.


    Nur gibt es ein Problem: Durch die Erweiterung auf MT kommt das Problem hinzu, dass ich ~6700 Future-Objekte beherberge.

    Die Überprüfung der Objekte dauert so lange, dass in dieser Zeit keine Status-Updates in der Konsole folgen können.


    Hat jemand eine Idee was ich tun kann, um den Code in ArchiveParser::CheckResults() deutlich zu beschleunigen?


    Ich bin über jede Hilfe glücklich. :)



    Github: https://github.com/Andosius/MapListGenerator

    Problemzeile: https://github.com/Andosius/Ma…5161fa18/src/main.cpp#L22

    • Hilfreich

    Heyho 👋🏼


    Hoffe es ist okay, wenn ich ein paar doofe Fragen stelle.


    Wozu wartest du auf die Threads? Gäbe es keine Möglichkeit, dass die Threads einfach direkt das irgendwo rein schreiben ihr Ergebnis? Direkt in eine Datenbank o.ä.?


    Wieso nutzt du jsons? 😅 Und nicht direkt z.B. eine (Postgre)SQL Datenbank?

    So könntest du aus den Threads heraus direkt das Ergebnis irgendwohin speichern und müsstest auf nichts warten im Mainthread.


    Die Überprüfung der Objekte dauert so lange, dass in dieser Zeit keine Status-Updates in der Konsole folgen können.

    Um nur das Problem konkret zu lösen, würde denke ich auch ein einfaches sleep reichen, was du in die Loop packst :)

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Absolut kein Thema, das sind gute Fragen. Persönlich kenne ich noch kein schönes SQL-Framework. Mit JSON hatte ich vorher schonmal gearbeitet, deshalb war das für mich nicht so befremdlich.

    Eigentlich hast du auch Recht. Ich kann doch im Mainthread mit ArchiveParser::GetQueueSize die verbleibenden Objekte abfragen und in ArchiveParser::ProcessElement ein mutex locken und direkt pushen.


    Dann ganz einfach die main-While-Schleife anpassen, dass die mit GetQueueSize() > 0 arbeitet und wenn die Queue Size auf 0 ist für 2 Sekunden sleepen. Hört sich zumindest sinnvoll an xD?



    Kannst du eventuell eine MariaDB-Bibliothek empfehlen? :/

    Der MariaDB Connector soll - soweit ich das zumindest lesen konnte - ziemlich schlecht sein.

  • Hört sich zumindest sinnvoll an xD?

    Ja, das klingt gut ;)


    Kannst du eventuell eine MariaDB-Bibliothek empfehlen? :/

    Der MariaDB Connector soll - soweit ich das zumindest lesen konnte - ziemlich schlecht sein.

    Habe bisher mit C++ nur mit PostgreSQL gearbeitet und damit mit libpqxx


    Aber der MariaDB Connector, ist wohl auch eine Alternative: https://github.com/mariadb-corporation/mariadb-connector-cpp


    Viel Erfolg 👍🏼

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Habe erstmal die paar Sachen umgesetzt und das sieht deutlich besser aus.

    Es ist nicht besonders schön aber hey, es funktioniert wie es soll. Es wäre vermutlich auch deutlich schneller, wenn ich nicht über das Netzwerk darauf zugreifen müsste. xD


    Bezüglich PostgreSQL: Ich sehe bereits seit Jahren viele Menschen darauf umsteigen. Vielleicht ist es dann auch mal für mich Zeit dem Strom zu folgen und sich mal langsam einzulesen. :=)