Buffer für schreiben in Datei



  • Du meinst, jeden einzelnen Wert aus dem Array per Schleife zu schreiben?
    Ich wüsste jetzt nicht wie du den Vorgang noch optimieren willst.Was du machen kannst,ist eventuell die Daten in einen Stream zu schreiben und den Stream gebündelt in die Datei zu ballern, wobei ich die Lösung nicht gerade schön finde.


  • Mod

    Bennnno schrieb:

    Dann stelle ich die Fragen anders: Gibt es eine Möglichkeit den Vorgang, jeden Wert einzeln in eine Datei zu schreiben, zu optimieren?

    Kaum. Möglichst alles in einem Rutsch schreiben, statt alle paar Sekunden einen einzelnen Wert, aber dass wirst du wohl bereits so machen.


  • Administrator

    Wieso ist es denn eigentlich so ein riesiger Aufwand? So etwas dauert bei mir etwas gegen die 200ms, also in einer Zeit, wo der Nutzer kaum was bemerkt.
    Wenn du willst, kannst du deinen Stream noch puffern, allerdings hat das bei mir nur ca. 20ms Unterschied auf diese Operation:

    std::size_t const BUFFER_SIZE = 4096;
    char buffer[BUFFER_SIZE];
    
    std::ofstream file(/*...*/);
    file.rdbuf->pubsetbuf(buffer, BUFFER_SIZE);
    
    // ...
    
    file.close();
    

    Wie schreibst du denn in das File? Irgendwelcher zusätzlicher aufwendiger Code dabei, der eine Struktur im File erstellen soll?

    Grüssli



  • Bennnno schrieb:

    Dann stelle ich die Fragen anders: Gibt es eine Möglichkeit den Vorgang, jeden Wert einzeln in eine Datei zu schreiben, zu optimieren?

    Gegenfrage: Gibt es eine Notwendigkeit, den Schreibvorgang zu optimieren?



  • ofstream ist schon gepuffert und du müßtest schon einen wahnsinnsaufwand treiben, um da noch ein fitzelchen schneller zu werden.
    falls du langsamkeit bemerkst, haste nen anderen fehler gemacht:
    a) ungetunte lib des MSVC60 genommen
    b) endl benutzt
    c) dauernd close/open gemacht
    d) noch was schlimmeres, ich bin schon ganz gespannt drauf.



  • Sorry, es hat für die Antwort leider etwas länger gedauert.

    Der Code sieht wie folgt aus:

    ofstream out_handle; 
    out_handle.open(file_handle, ios_base::out | ios_base::binary); 
    
    for(int i=0;i<ySize;i++){
    	for(int j=0;j<xSize;j++){
    		out_handle << floatPixel[i][j];
    	}
    }
    
    out_handle.close();
    

    FloatPixel ist ein 2-dimensionaler Vektor, der eine Art Matrix simuliert.
    ySize=240, xSize=320

    Ich mache noch einen haufen weiterer Dateizugriffe, die allerdings alle nur lesen. Diese laufen aber gewohnt schnell.

    Zum die Situation noch einmal zu verdeutlichen: Zum schreiben der Werte benötige ich ca. 4-5 Sekunden. Zu lang für meinen Geschmack.



  • Geschmack ist irgendwie fehl am Platz, bei einer solchen Bewertung.

    Du schreibst ca. 300 kbyte raus, wenn ich richtig gerechnet habe.
    Kann auf einem PC-System normal sein, je nach Hardware. Wie gesagt, Geschmack bringt uns hier nicht weiter.

    Was hast du für ein PC-System? Welche Std-Lib-Implementierung? Compiler? Welche Runtime linkst du?



  • Optimieren könnte man auch, in dem man nicht einzeln in den filestream schreibt. Z.B. in dem man die ganzen Werte 76800 einzelnen Werte in einen stringstream schreibt. Und dann diesen mit .str() in den filestream haut.

    void write(std::ostream &os)
    {
     for(int i=0;i<ySize;i++){
         for(int j=0;j<xSize;j++){
             out_handle << floatPixel[i][j];
         }
     }
    }
    
    voif foo()
    {
     stringstream os;
     write(os);
    
     ofstream out_handle(file_handle, ios_base::out | ios_base::binary);
     out_handle << os.str();
     out_handle.close();
    
    }
    

    write() kann auch filestreams annehmen. Haste gleich noch abstrahiert. 😃



  • In write() natürlich os anstatt out_handle benutzen (blödes copy+paste).



  • Vielen Dank erstmal, leider hält sich der Optimierungsgrad bei der Lösung in Grenzen.

    Gibt sonst evtl. eine Alternative die Daten anderweitig zwischenzuspeichern?
    Die Datei war eigentlich als Schnittstelle zwischen 2 Programmen gedacht, die getrennt voneinander laufen. Der Lösungsansatz sollte allerdings ähnlich einfach wie bei einer Datei sein.

    Bin für jede Anregung dankbar.



  • War es nicht besonders schneller mit dem stringstream??? 😮

    Wenn zwei Programme Daten austauschen sollen, fällt das unter IPC:
    http://www.boost.org/doc/libs/1_38_0/doc/html/interprocess.html

    Evtl. ist auch MPI http://www.boost.org/doc/libs/1_38_0/doc/html/mpi.html interessant.


Anmelden zum Antworten