Schnelles Lesen und Schreiben von großen Datenmengen



  • Liebe Community,

    ich brauche mal einen Tipp, wie ich am schnellsten von Dateien lesen und schreiben kann - ich brauche keinen Code, sondern eher Stichwörter mit was ich mich befassen sollte.
    Hier das Problem:
    Ich verarbeite Messdaten die in mehreren Textdateien gespeichert werden (Gesamtgröße jeder Datei sind mehrere GB). Jede txt datei ist wie folgt aufgebaut:

    <double> <float> <float>
    <double> <float> <float>
    <double> <float> <float>
    ....

    sind insgesamt über 100 Millionen Zeilen in verschiedenen Files.

    So was muss ich tun:
    1. Schritt jedes File einlesen und eine gleichbleibende Nummer hinzufügen und in ein gemeinsames neues File schreiben, dass dann wie folgt aussieht

    <double> <float> <float> <integer>
    <double> <float> <float> <integer>
    <double> <float> <float> <integer>
    <double> <float> <float> <integer>
    .....

    Dieses sortiere ich dann anschließend.

    2. Schritt: Das sortierte File wird wieder eingelesen und ich brauche jeden einzelnen Wert eine Zeile als neue Variable.

    Momentan arbeite ich mit ifstream und ofstream und lese und schreibe jede Zeile einzeln neu - das muss aber doch schneller gehen oder?

    Ob nun C oder C++ ist mir eigentlich auch egal 😉

    Wäre super wenn ihr mir ein paar Tipps geben könnt.

    Liebe Grüße



  • Halo,

    bzgl. lesen und schreiben wird Werner Salomon dir wohl irgendwann die perfekte Antwort geben.

    Ich hab nur eine Frage zur Verarbeitung:

    Dieses sortiere ich dann anschließend.

    Warum anschliessend?
    Du sortierst doch nach <integer> und <integer> wird nach Src-File vergeben oder?
    Dann kannst du das doch gleich in der richtigen Reihenfolge schreiben.





  • Jockelx schrieb:

    Halo,

    bzgl. lesen und schreiben wird Werner Salomon dir wohl irgendwann die perfekte Antwort geben.

    Ich hab nur eine Frage zur Verarbeitung:

    Dieses sortiere ich dann anschließend.

    Warum anschliessend?
    Du sortierst doch nach <integer> und <integer> wird nach Src-File vergeben oder?
    Dann kannst du das doch gleich in der richtigen Reihenfolge schreiben.

    Problem ist im Grunde habe ich verschiedene Detektoren. Die Doublezahl ist eine Zeitangabe. Deshalb schreibe ich die einzelnen Messergebnisse pro Detektor in ein File und füge die Detektornummer hinzu - dann sortiere ich alles nach der Zeit.



  • Hallo Lummel202,

    Du kannst Dich hier https://www.c-plusplus.net/forum/310076-full schon mal einlesen.
    Details vielleicht später.

    Wenn eine(!) der Dateien schon mehrere GByte groß ist - gehen die Daten aus dieser Datei dann noch in einem Stück in den Speicher?

    Gruß
    Werner



  • Super, die fgets methode beschleunigt mein Einlesen der Daten ungemein.
    Allerdings ist das schreiben der Flaschenhals wenn ich das richtig sehe.
    Da ich immernoch die Daten einzeln abschreibe, gibt es irgendwie eine Möglichkeit immer en Block die Daten zu schreiben?
    Habe versucht die Daten in einen Vektor zu speichern und sobald dieser eine gewisse länge hat diesen abzuspeichern. Allerdings klappt das abspeichern nicht. Ist das generell sinnvoll?
    Welche Möglichkeiten habe ich denn noch?

    Liebe Grüße



  • Lummel202 schrieb:

    Allerdings ist das schreiben der Flaschenhals wenn ich das richtig sehe.

    Ich sehe nicht ein warum das so sein muss. Probier's doch einfach mal aus.

    Lummel202 schrieb:

    Da ich immernoch die Daten einzeln abschreibe, gibt es irgendwie eine Möglichkeit immer en Block die Daten zu schreiben?

    Die FILE* bzw. std::ostream Implementierungen verwenden IIRC auch beim Schreiben einen eigenen Puffer, rufen also nicht wegen jedem Byte die OS-Funktion zum Schreiben in das File auf.
    Davon unabhängig kannst du natürlich immer selbst Daten zusammensammeln und dann am Stück rausschreiben.

    Lummel202 schrieb:

    Habe versucht die Daten in einen Vektor zu speichern und sobald dieser eine gewisse länge hat diesen abzuspeichern. Allerdings klappt das abspeichern nicht.

    Das klappt wunderbar - wenns bei dir nicht geht hast du vermutlich was falsch gemacht.

    Lummel202 schrieb:

    Ist das generell sinnvoll?
    Welche Möglichkeiten habe ich denn noch?

    Kommt drauf an. Ich würde sagen es ist generell sinnvoll, wenn man denn überhaupt ein Performance-Problem beim Schreiben hat. Und andere möglichkeiten sehe ich nicht wirklich.
    Sind ja eigentlich nur zwei Sachen die Zeit kosten können:

    1. Die eigentliche Serialisierung, also das Verwandeln von was auch immer du in deinen Objekten stehen hast in eine Bytewurst die man in ein File schreiben kann
      und
    2. Das Schreiben der serialisierten Daten in ein File

    Die beiden Vorgänge kann man recht gut getrennt voneinander optimieren. Und Teil (2) kann man quasi nur durch "puffern und grössere Blöcke schreiben" beschleunigen.


Anmelden zum Antworten