Verständnisfrage



  • Hallo,
    ich habe mir ein kleines Prog. geschrieben, das X Zeichen aus einer Datei einliest, bearbeitet und wieder in einer anderen Datei speichert.
    theoretisch läuft es also folgendermaßen ab:

    while (noch nicht die ganze datei eingelesen)
    {
    readdatei öffnen
    X Zeichen aus readdatei in c-string readstring speichern
    readdatei schließen
    
    daten nach c-string writestring kopieren//daten bearbeiten
    
    writedatei öffnen
    writestring schreiben
    writedatei schließen
    }
    

    Das heißt, je kleiner X, desto öfter müssen die Dateien geöffnet und geschlossen werden --> unnötiger CPU-Verbrauch
    Deshalb habe ich mir gedacht, dass man möglicht viele Daten einlesen sollte und habe spontan mal ein MiB genommen.
    mhh...
    irgendwie war das nicht gerade schnell...
    jetzt habe ich PRAKTISCH festgestellt, dass mein Prog. auf meinem PC am schnellsten arbeitet, wenn es ca. 600 B einliest.
    unter 64 B und über 64 KiB wird es unerträglich langsam (rapide!!!)
    Kann mir jemand sagen weshalb?
    RAM hab ich genug.
    meine c-strings sind dynamisch angelegt



  • [quote="sudo rm -rf"]Hallo,
    ich habe mir ein kleines Prog. geschrieben, das X Zeichen aus einer Datei einliest, bearbeitet und wieder in einer anderen Datei speichert.
    theoretisch läuft es also folgendermaßen ab:

    while (noch nicht die ganze datei eingelesen)
    {
    readdatei öffnen
    X Zeichen aus readdatei in c-string readstring speichern
    readdatei schließen
    
    daten nach c-string writestring kopieren//daten bearbeiten
    
    writedatei öffnen
    writestring schreiben
    writedatei schließen
    }
    

    Mach draus

    readdatei öffnen
    writedatei öffnen
    while (noch nicht die ganze datei eingelesen)
    {
    X Zeichen aus readdatei in c-string readstring speichern
    
    daten nach c-string writestring kopieren//daten bearbeiten
    
    writestring schreiben
    }
    writedatei schließen
    readdatei schließen
    

    und alles wird gut.
    Der Performance sollte dann bei Schreibaufträgen zwischen 4k und 64k optimal sein, mit kaum messbaren einbußen bei noch größeren Aufträgen, aber bei unter 1k wirds schon langsam bemerkbar bis runter zu Bytegroßen Mini-Aufträgen, wo der Rechner sich schämen sollte, wie langsam er auf einmal ist.



  • ja, so ähnlich hatte ich es zu erst.
    der nachteil finde ich ist aber, dass permanent die dateien geöffnet sind.
    wenn der strom ausfällt oder sonstiges kann man die dateien doch dann vergessen, oder?



  • Wieso willst du die Datei schließen, wenn du sie im nächsten Schritt bearbeiten willst? Das ist der Grund, warum deine Programm so langsam wird.



  • sudo rm -rf schrieb:

    ja, so ähnlich hatte ich es zu erst.
    der nachteil finde ich ist aber, dass permanent die dateien geöffnet sind.
    wenn der strom ausfällt oder sonstiges kann man die dateien doch dann vergessen, oder?

    Sicherung gegen Stromausfall?
    Mußt Du wirklich jedes Byte absichern? Mals abgesehen vom Betriebssystemcache, mehr als 4k Verlust am Ende gibts eh nicht, denn der ofstream-Puffer schreibt sich immer raus, wenn er voll wird.

    Falls Du jede Zeile auf die Platte gegen Stromausfall sichern mußt, geht es nicht schnell. Nur wenige hundert Zeilen pro Sekunde.



  • Zeus schrieb:

    Wieso willst du die Datei schließen, wenn du sie im nächsten Schritt bearbeiten willst?

    Nun, weil ich die Originaldatei nicht überschreiben will, sondern eine zweite anlegen möchte.
    deswegen auch readdatei und writedatei

    volkard schrieb:

    Falls Du jede Zeile auf die Platte gegen Stromausfall sichern mußt, geht es nicht schnell. Nur wenige hundert Zeilen pro Sekunde.

    naja, mein altes prog (wie in deinem beispiel) arbeitete mit 2,2 Mib/sek
    mein jetztiges mit 512 Byte Puffer leistet 1,9 MiB/sek

    aber kann mir jemand sagen, weshalb es so derbe langsam wird, wenn ich 1MiB einlese, bearbeite und dann schreibe?
    Da ist mein 512 Byte Programm ohne zu übertreiben 100 mal schneller! eher noch schneller



  • naja, mein altes prog (wie in deinem beispiel) arbeitete mit 2,2 Mib/sek
    mein jetztiges mit 512 Byte Puffer leistet 1,9 MiB/sek

    aber kann mir jemand sagen, weshalb es so derbe langsam wird, wenn ich 1MiB einlese, bearbeite und dann schreibe?
    Da ist mein 512 Byte Programm ohne zu übertreiben 100 mal schneller! eher noch schneller[/quote]

    Ohne konkreten Quelltext geht jetzt das Rätselraten los. Bei einem Faktor von über 100 liegt die Vermutung nahe, dass der Algorithmus nicht optimal ist, sondern nur gutes Laufzeitverhalten für kleine Datenmengen hat.


Anmelden zum Antworten