Große Datenmenge in Datei schreiben
-
Hallo,
ich stehe vor einer bis jetzt nicht für mich lösbaren Aufgabe

Ein Messdatensatz von knappe 200 kB wird 20-30 Mal pro Sekunde aktualisiert und soll in eine Datei geschrieben werden.
z.B.
struct MD { u16 *a; u16 *b; u16 *c; u16 *d; u16 *f; };a,b,c,d,e sollen Arrays mit einer Größe von 150x150;
Bisher versuchte ich es mit ofstreams und FILE.
Nach circa 900 Schreibzyklen wird das Schreiben der Datei extrem langsamer.
Es sollen Datenmengen um 2-3 GB entstehen.
Was kann man tun, um möglichst viele Daten sequentiell in eine Datei zu schreiben?
Grüße
Speedy
-
Für welches OS? Wie sehen deine bisherigen Versuche aus?
-
Im Moment unter Windows 7. Portierung auf Linux ist geplant.
Wie gesagt mit FILE und ofstream -> zyklisches Füllen der Dateien.
z.B.
ofstream myfile; .. myfile.write((const char*)(setMB->a), sizeof(int)*150*150);oder
... fwrite(setMB->a,sizeof(int)*150*150,1,fp); ...Danke schon mal!
Speedy
-
Wie wär's mal mit C++? Damit meine ich im Standard festgehaltene Datentypen wie long statt Zeiger:
struct MD { long a; long b; long c; long d; long f; };Die Casts sind auch nicht unbedingt hübsch und sicher. Besser:
ofstream myfile; .. myfile << setMB->a;
-
Rew. schrieb:
Wie wär's mal mit C++? Damit meine ich im Standard festgehaltene Datentypen wie long statt Zeiger:
-> Zeiger, da Daten auf dem Heap liegen. Stack zu klein.
Rew. schrieb:
struct MD { long a; long b; long c; long d; long f; };Die Casts sind auch nicht unbedingt hübsch und sicher. Besser:
ofstream myfile; .. myfile << setMB->a;Funktioniert bei fixen VAraibelgrößen.
-
write ist eigentlich schon das beste, was du machen kannst. Wenn deine Schreibzyklen allesamt 150*150*4*6 Bytes haben, dann sind 900 Zyklen 500 MB. Das klingt danach als würde da irgendein Cache voll laufen und es wird tatsächlich angefangen, Daten auf die Platte zu schreiben. Dann bricht natürlich die Schreibzeit aus Sicht des Programmes gewaltig ein. Im Schnitt wirst du am Ende natürlich auf Datenmenge/Festplattengeschwindigkeit als Zeit kommen, bloß am Anfang hast du einen anderen Eindruck, weil du mit RAM-Geschwindigkeit schreibst.
-
Speedy123 schrieb:
200 kB wird 20-30 Mal pro Sekunde
Das entspricht maximal ca. 6MB/s, was für aktuelle SATA Schnittstellen und Platten eigentlich kein Problem sein sollte.
Stellt das denn ein Problem dar? SeppJ hat ja schon geschrieben, dass Du wahrscheinlich in eine Geschwindigkeitsbegrenzung reinläufst, weil ein Cache voll ist.
Selbst wenn Du Dir eine lokale Lösung baust (eigener Cache, ein Thread der die Daten daraus wegschreibt, ...) wirst Du irgendwann auf die Geschwindigkeitsgrenze der Hardware laufen, auf der die Datei liegt.
-
Du kannst unter Windows bei
CreateFileüber bestimmte Flags das Verhalten steuern. Die höchste Performance erreicht man wohl über FILE_FLAG_NO_BUFFERING | FILE_FLAG_OVERLAPPED und asynchronenWriteFileAufrufen. Ich hab´ da allerdings selbst wenig Erfahrung als dass ich da konkrete Tipps geben könnte.
-
Wenn dein System und dein Compiler 2-3 GB Daten im Ram zulassen, dann allokiere zum Schreiben alles dort. Die Erstellung der Datei kann dann zum Schluss erfolgen. Nur ein Tipp ohne eigene Erfahrungen in dieser Grössenordnung.