Datei schreiben.

july

Erfahrenes Mitglied
Hallo zusammen,

ich hab da mal wieder eine Frage :) Ich muss 10.000 Zeilen Text in eine Datei schreiben und das 10.000 mal hintereinander(in einer Schleife). Habt ihr eine Empfehlung wie ich das am effektivsten mach, so dass es am schnellsten geht und am besten noch unter 1 min?

Grüße July
 
Wie lang ist denn eine Zeile?
Ist dir klar, dass du pro Zeilenbyte insgesamt
ca. 100MB Datendurchsatz auf die Festplatte hast?

Generell: Keine Streamklassen etc verwenden, sondern so lowlevel wie möglich.
Bei solchen Mengen zahlt sich das schon aus.
Die Compilereinstellungen durchackern, ob man irgendwo noch was optimieren kann.
Asm verwenden (:D).
 
Zuletzt bearbeitet:
Juchuu, 12 GB :D
Also, ob das in einer Minute geht, hängt von deinem Rechner ab...

Wie ich auf die Zahl komme?

10 000 Mal x 10 000 Zeilen x 120 Byte = 12 000 000 000 Byte = ca. 12GB
 
es wird immer dieselbe datei überschrieben, also brauch ich keine 12GB, sondern nur
10 000 Zeilen X 120 Byte = 1,2 MByte

P.S. hab falsch verstanden, jetzt weiß ich was du mit 12 GB meinst, ist nicht die Dateigröße sondern Detenmenge, die verarbeitet werden muss
 
Zuletzt bearbeitet:
und wie geht's am schnellsen diesen Durchsatz zu verarbeiten? Momentan realisiere ich es mit ofstream, aber es dauert mir viel zu lange.. (1950ms /10 000Nachrichten)
 
Zuletzt bearbeitet:
Wenn du nicht 10000 einzelne Dateien schreibst, sondern den Inhalt immer wieder löscht und neu schreibst, dann:
-brauchst du am Schluss zwar nur 1.2MB Platz
-jagst aber trotzdem während dem Programmdurchlauf 12GB
über OS/Treiber/Mainboard/HDD-Controller/HDD.

Und Maßnahmen hab ich schon geschrieben.
In Reihenfolge der Schnelligkeit von langsam bis schnell:
ofstream->fputs->eventuell Assembler.

Viel wirst du trotzdem nicht rausholen.
Der langsamste Teil in der Verarbeitung sind nicht MB/CPU/RAM (die die genannten Befehle übernehmen), sondern die Festplatte selber.

Welches Modell hast du denn?
 
Hi,

wie sheel schon angemerkt hat, solltest du die Stream-Klassen vermeiden und auf die Lowlevel-C-Funktionen zurückgreifen. Die folgenden Funktionen sollten eigentlich ausreichen:

fopen()
fwrite()
fseek()
fclose()

Damit sollte es schon ziemlich schnell gehen. Ob du allerdings die 12 GiB unter einer Minute schaffst kommt auf deine Festplatte an, wie schnell die darauf schreiben und den Kopf wieder neu ausrichten kann. Auch das Dateisystem spielt dabei natürlich eine Rolle, ebenso ob diese stark fragmentiert ist.

Rein rechnerisch bräuchtest du bei 12 GiB in 1 Minute um die 190 MiB/s Datendurchsatz. Meiner Erfahrung nach schaffen aber die meisten Platten nur in etwa 50 - 100 MiB/s. Also dürfte eine Laufzeit zwischen 2 und 3 Minuten eigentlich schon ziemlich gut sein.

Gruß
BK
 
Rein rechnerisch bräuchtest du bei 12 GiB in 1 Minute um die 190 MiB/s Datendurchsatz. Meiner Erfahrung nach schaffen aber die meisten Platten nur in etwa 50 - 100 MiB/s. Also dürfte eine Laufzeit zwischen 2 und 3 Minuten eigentlich schon ziemlich gut sein.
Wenn immer wieder diesselbe kleine Datei überschrieben wird, stehen die Chancen gut, dass die Schreibvorgänge vom Cache (der Festplatte und/oder des OS) aufgefangen werden.

Hab das grade mal getestet, wenn man die Datei nur einmal öffnet und am Ende wieder schließt, dauern 10.000 Schreibvorgänge von 1.200.000 Bytes auf meiner Maschine unter 3 Sekunden. Öffnet und schließt man die Datei nach jedem Durchlauf, steigt die Zeit auf 1:40 Minuten.

Grüße,
Matthias
 
Zurück