performant in eine Datei schreiben



  • Kann hier einer C++ und kann mir was dazu sagen, wie man performant in eine Datei schreibt

    ausprobiert hab ich:

    #include <fstream>
    
    std::ofstream file("progga.txt");
    file << "daten";
    

    ist aber ziemlich lahm.

    Naja, eigentlich sollte C++ ja recht schnell sein.

    Ist das automatisch gepuffert, oder kann man da noch etwas mit Pufferung erreichen?



  • welcher compiler?



  • Da hat einer eine Frage, die ich im Chat gestellt habe, hier gestellt.

    Compiler: g++ mit höchster Optimierungsstufe.

    g++ (GCC) 3.3 20030226 (prerelease) (SuSE Linux)

    [ Dieser Beitrag wurde am 11.07.2003 um 13:21 Uhr von Gregor editiert. ]



  • wieviel langsamer als die festplattenschreibgeschwindigkeit ist es denn?



  • Es ist um ein Vielfaches langsamer, als es möglich ist. Volkard hatte im Chat etwas von mmap erzählt, damit soll das schneller gehen.



  • Original erstellt von Gregor:
    Es ist um ein Vielfaches langsamer, als es möglich ist. Volkard hatte im Chat etwas von mmap erzählt, damit soll das schneller gehen.

    oder mmap oder fwrite oder fstream, die schrieben bei mir immer alle sehr schnell.
    aber bei mmap kannste sicher sein, daß kein fehler dazwischen ist.



  • Original erstellt von <progga>:
    Ist das automatisch gepuffert, oder kann man da noch etwas mit Pufferung erreichen?

    Erst mal den stdio-Puffer abstellen.



  • ...dann sicherstellen, dass man mit einer ordentlichen fstream-Implementation arbeitet (Stichwort: Dinkumware-Fix). Und nicht formatiert schreiben, wenn man die Formatierung nicht braucht.



  • Original erstellt von HumeSikkins:
    ...dann sicherstellen, dass man mit einer ordentlichen fstream-Implementation arbeitet (Stichwort: Dinkumware-Fix).

    Die fstream-Implementierung der aktuellen GCC ist eigentlich recht ok.



  • Original erstellt von HumeSikkins:
    Und nicht formatiert schreiben, wenn man die Formatierung nicht braucht.

    das heißt jetzt read, oder doch sgetn?



  • das heißt jetzt read, oder doch sgetn?

    Ich dachte es geht um schreiben. Aber deine Frage lässt mich vermuten, dass ich mal wieder was falsches geschrieben habe. In diesem Fall bitte verbessern.



  • Wo wir gerade dabei sind, wie hol ich die Daten möglichst schnell aus einer Datei?

    Im Moment mach ich:

    vector<char> datei(istreambuf_iterator<char>(mystream), istreambuf_iterator<char> ));
    

    Könnte man sonst irgendwie noch was optimieren? Ich will die Datei einfach nur roh in den Speicher reinkriegen.

    MfG Jester



  • Original erstellt von Jester:
    Könnte man sonst irgendwie noch was optimieren? Ich will die Datei einfach nur roh in den Speicher reinkriegen.

    in so grossen bloecken wie nur moeglich lesen, also zB istream::read() verwenden... oder OS funktionen ala mmap/CreateFileMapping

    der 'trick' ist: so wenig einzelne schreib oder leseoperationen auf der platte zu haben wie moeglich. also im idealfall alles in einem rutsch in den speicher laden.

    es sei denn die datei ist groesse als das vorhandene RAM - dann ists wieder bloed 😉



  • Hab grad ein bissel rumprobiert, was schnelleres als meinen Code von oben hab ich noch nicht gefunden.



  • Das:

    vector<char> datei(istreambuf_iterator<char>(mystream), istreambuf_iterator<char> ));

    ist ein Syntaxfehler.

    Das :

    vector<char> datei(istreambuf_iterator<char>(mystream), istreambuf_iterator<char> ());
    

    eine Funktionsdeklaration.

    Und das:

    vector<char> datei(istreambuf_iterator<char>(mystream), (istreambuf_iterator<char>( )));
    

    oder besser das:

    istreambuf_iterator<char> begin(mystream), end;
    vector<char> datei(begin,end);
    

    ist der ziemlich coole Code zum Einlesen in einen Vektor 🙂

    Prinzipiell sollte der Code genauso flott wie read sein (er liest ja z.B. auch unformatiert). In der Praxis gibt es wohl aber noch einige Implementationen mit lahmen itstream(buf)_iteratoren.
    Der große Vorteil ist imo, dass man so schön direkt in einen Container lesen kann.

    [ Dieser Beitrag wurde am 12.07.2003 um 09:34 Uhr von HumeSikkins editiert. ]



  • sehr grad den unterschied der deklararion zu dem uncoolen code nicht.



  • Ja gut, im Code steht's richtig. Modulo Klammer halt 😉

    Bei 60MB brauch ich mit STLPort ca. 100 - 130 s.
    Mit der normalen STL vom VC7.1 komm ich auf 210-230s
    Da fällt die Wahl nicht schwer. 🙂


Anmelden zum Antworten