2Danke
ERLEDIGT
NEIN
NEIN
ANTWORTEN
11
11
ZUGRIFFE
266
266
EMPFEHLEN
-
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 (
).
Geändert von sheel (14.09.11 um 14:54 Uhr)
Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
also jede Zeile hat um die 90-120 characters.Wie lang ist denn eine Zeile?
versteh ich noch nicht so ganz. Wie kommst du auf 100MB?Ist dir klar, dass du pro Zeilenbyte insgesamt
ca. 100MB Datendurchsatz auf die Festplatte hast?
-
Juchuu, 12 GB

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. 12GBNetiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
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 mussGeändert von july (14.09.11 um 15:26 Uhr)
-
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)
Geändert von july (14.09.11 um 15:24 Uhr)
-
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?Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
14.09.11 15:36 #8
- Registriert seit
- Jun 2007
- Ort
- Passau (Niederbayern)
- Beiträge
- 1.394
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Über eine gute Bewertung freut sich jeder ;)
Bitte erledigte Threads als "Erledigt" markieren.
"Though a program be but three lines long, someday it will have to be maintained.''
-- Geoffrey James, "The Tao of Programming"
-
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„Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
“For every complex problem, there is an answer that is short, simple and wrong.”
“Pessimism is safe, but optimism is a lot faster!”
Aktuelles Coding Quiz: #17 - Wörter kreuz und quer
-
16.09.11 08:41 #10
- Registriert seit
- Jun 2007
- Ort
- Passau (Niederbayern)
- Beiträge
- 1.394
Hi,
stimmt, das fflush() darf man natürlich auch nicht vergessen
Gruß
BKÜber eine gute Bewertung freut sich jeder ;)
Bitte erledigte Threads als "Erledigt" markieren.
"Though a program be but three lines long, someday it will have to be maintained.''
-- Geoffrey James, "The Tao of Programming"
-
ich komm leider mit dem Rechner hier nicht mal annähernd auf so gute Zeiten :/
und da ich zeilenweise reinschreiben muss, benutze ich fputs... ich hoffe das verlangsamt das ganze nicht zu sehr?
-
Ist ok, fputs sollte schon in Ordnung sein.
Ist im Prinzip nichts anderes als eine Byte-Schleife.Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
Ähnliche Themen
-
Formular in Tabulatorgetrennte Datei schreiben bzw. Datei vervollständigen
Von Muckel1986 im Forum PHPAntworten: 4Letzter Beitrag: 12.09.08, 14:08 -
[C#] Kanäle aus Stereo WAV Datei in je eine neue WAV Mono Datei schreiben
Von Webrat im Forum .NET Grafik und SoundAntworten: 2Letzter Beitrag: 12.02.08, 18:21 -
Zeilenweise aus Ini Datei lesen und in neue Datei schreiben
Von Putzwied im Forum C/C++Antworten: 2Letzter Beitrag: 27.04.07, 08:16 -
Aus Datei lesen und in eine andere Datei schreiben
Von Computerpinguin im Forum C/C++Antworten: 1Letzter Beitrag: 03.05.05, 14:29 -
viele errechnete werte sofort in datei schreiben oder sammeln und dann schreiben?
Von larss im Forum JavaAntworten: 4Letzter Beitrag: 25.04.05, 22:15





Zitieren



Login






