Buffer für schreiben in Datei
-
Hallo,
ich habe ein Feld von 320*240 ~ 75000 Float Werten. Diese sollen in einer Datei zwischengespeichert werden. Derweil wird jeder Wert einzeln in die Datei geschrieben, was natürlich ein riesiger Aufwand ist. Um diesen zu minimieren hatte ich überlegt zuerst einen Buffer anzulegen und diesen dann in die Datei zu schreiben.
Ich hatte da nun an einen der Streambuffer gedacht.
Bzw. kann man einen Filebuffer anlegen und nachher einfach an die Datei übergeben?
Gibt es bessere Alternativen?Ich danke für jede Anregung.
-
Das Betriebssystem buffert schon für dich und macht das im Zweifelsfall besser als wenn du das selber versuchst.
edit: Und wenn du tatsächlich für eine Plattform ohne Buffer programmierst (und nur dann), würde ich alles in einen stringstream schreiben und den dann regelmäßig in die Datei schreiben.
-
Dann stelle ich die Fragen anders: Gibt es eine Möglichkeit den Vorgang, jeden Wert einzeln in eine Datei zu schreiben, zu optimieren?
-
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.
-
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.
-
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=320Ich 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.htmlEvtl. ist auch MPI http://www.boost.org/doc/libs/1_38_0/doc/html/mpi.html interessant.