tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von sheel
  • 1 Beitrag von Bratkartoffel
ERLEDIGT
NEIN
ANTWORTEN
11
ZUGRIFFE
266
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    july july ist offline Mitglied Gold
    Registriert seit
    May 2011
    Beiträge
    103
    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
     

  2. #2
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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, ...?

  3. #3
    july july ist offline Mitglied Gold
    Registriert seit
    May 2011
    Beiträge
    103
    Wie lang ist denn eine Zeile?
    also jede Zeile hat um die 90-120 characters.

    Ist dir klar, dass du pro Zeilenbyte insgesamt
    ca. 100MB Datendurchsatz auf die Festplatte hast?
    versteh ich noch nicht so ganz. Wie kommst du auf 100MB?
     

  4. #4
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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. 12GB
     
    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, ...?

  5. #5
    july july ist offline Mitglied Gold
    Registriert seit
    May 2011
    Beiträge
    103
    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
    Geändert von july (14.09.11 um 15:26 Uhr)
     

  6. #6
    july july ist offline Mitglied Gold
    Registriert seit
    May 2011
    Beiträge
    103
    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)
     

  7. #7
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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?
    july bedankt sich. 
    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, ...?

  8. #8
    Avatar von Bratkartoffel
    Bratkartoffel Bratkartoffel ist offline gebratene Kartoffel
    tutorials.de Premium-User
    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
    july bedankt sich. 
    Ü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"

  9. #9
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.802
    Blog-Einträge
    5
    Zitat Zitat von Bratkartoffel Beitrag anzeigen
    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
     
    „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

  10. #10
    Avatar von Bratkartoffel
    Bratkartoffel Bratkartoffel ist offline gebratene Kartoffel
    tutorials.de Premium-User
    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"

  11. #11
    july july ist offline Mitglied Gold
    Registriert seit
    May 2011
    Beiträge
    103
    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?
     

  12. #12
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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

  1. Antworten: 4
    Letzter Beitrag: 12.09.08, 14:08
  2. Antworten: 2
    Letzter Beitrag: 12.02.08, 18:21
  3. Antworten: 2
    Letzter Beitrag: 27.04.07, 08:16
  4. Aus Datei lesen und in eine andere Datei schreiben
    Von Computerpinguin im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 03.05.05, 14:29
  5. Antworten: 4
    Letzter Beitrag: 25.04.05, 22:15

Stichworte