Progressbar und Zeiteffizienz



  • Ich schreibe ein datenverarbeitendes Programm. Es liest Messdateien, die mitunter sehr viel Datensätze beinhalten können (bis ca. 20000). Da der Ladevorgang einige Zeit in Anspruch nimmt, dachte ich mir, ich erhöhe den Anwendungskomfort, in dem ich ne Progressbar einbaue. Problem ist nur, wie bekomme ich raus, wie ich die Progressbar dimensioniere, bevor ich die Datei einlese (ich lese zeilenweise, nicht zeichenweise)? Ein erstes vollständiges "Durchrennen" nur um die Anzahl der Zeilen herauszubekommen verdoppelt den Leseaufwand fast. Lösungsvorschläge?



  • Entweder du nutzt eine Neverending Progressbar 😃 🤡 oder du wirst wohl einen Header in deine Datei einbauen müssen, in dem angegeben ist, wie viele Datensätze die entsprechende Datei enthält. Das ist zwar bei ASCII-Dateien etwas ungünstig, aber du kannst ja einfach die erste Zeile dafür verwenden.

    Wenn die einzelnen Zeilen immer (annähernd) gleich lang sind und keine Fremddaten mehr in der Datei enthalten sind, kannst du die Anzahl der Datensätze ja auch anhand der Dateigröße abschätzen.



  • Sind die Datensätze nicht immer gleich groß?

    Einfach Dateigröße/Datensatzgröße = N



  • Naja, das Problem ist, dass die zu lesenden Zeilen immer ungefähr gleich lang sind, aber dazwischen beliebig viele Kommentare sein dürfen, die aber nicht eingelesen werden und auch sonst keinen Regeln unterliegen.

    Das Format kann ich nicht editieren, da es Dateien sind, die eine fertige Software ausspuckt (Touchstone-Format).

    Wie geht denn diese "unendliche Progressbar"?



  • zwette schrieb:

    Wie geht denn diese "unendliche Progressbar"?

    Wie beim Boot von WinXP 🤡 ...



  • zwette schrieb:

    ich lese zeilenweise, nicht zeichenweise

    wie genau?
    mit ifstream und du kannst ruhig mal hin une wieder tellg() machen? oder mit ner fertigen klasse, die du aber leicht reimplemetieren kannst?



  • Ich greif mal das von Volkard auf:
    Du springst ganz am Anfang mit seek(..) ans das Ende der Datei.
    Mit tellg() kennst du dann die genaue Größe der Datei.
    Nach jedem Datensatz machte dann ein tellg() und weißt wo du bist und kannst so deine Progressbar setzten.

    Bei einem langen Kommentar springt dann der Balken ein gutes Stück nach vorn - aber das ist ja nicht schlimm.



  • Hat von Euch schonmal jemand ne vernünftige Progressbar gesehen, die nicht hin und wieder springt? => Progress-Bars müssen springen! 🤡 (zumindest unter Windows)



  • Die Frage ist, mußt du es auf die Datensätze runter brechen? Willst du etwa eine Progressbar mit 20.000 Steps haben? Ich kenne keine Progressbar die 20.000 Pixel (!) breit sein kann. So einen Monitor und Grafikauflösung habe ich jedenfalls nicht. 😉

    Was dauert denn so lange einzulesen, von 20.000 Datensätze? Liest du von Platte jeden Datensatz einzeln ein? 😮 Lies doch die Datei in einem Rutsch ein und verarbeite dann alles im Hauptspeicher. Im Hauptspeicher sind 20.000 Datensätze nämlich ruck zuck verarbeitet.



  • Artchi schrieb:

    Die Frage ist, mußt du es auf die Datensätze runter brechen? Willst du etwa eine Progressbar mit 20.000 Steps haben? Ich kenne keine Progressbar die 20.000 Pixel (!) breit sein kann. So einen Monitor und Grafikauflösung habe ich jedenfalls nicht.

    Es soll Komponenten geben, die sich genau um diese Problematik kümmern: Man kann die Anzahl der Steps angeben und unabhängig(!) davon die Breite der Anzeige. 🙂



  • Ich würde in dem Fall einfach nur anzeigen bei welchem Datensatz er gerade ist ...
    Als Anwender würde mir das als Information reichen 🙂



  • [quote="Artchi"]Die Frage ist, mußt du es auf die Datensätze runter brechen? Willst du etwa eine Progressbar mit 20.000 Steps haben? Ich kenne keine Progressbar die 20.000 Pixel (!) breit sein kann. So einen Monitor und Grafikauflösung habe ich jedenfalls nicht. ;)[/qoute]
    Das bedeutet ja nur, dass die Progressbar 20.000 Steps braucht, bis sie voll ist.

    Artchi schrieb:

    Was dauert denn so lange einzulesen, von 20.000 Datensätze? Liest du von Platte jeden Datensatz einzeln ein? 😮 Lies doch die Datei in einem Rutsch ein und verarbeite dann alles im Hauptspeicher. Im Hauptspeicher sind 20.000 Datensätze nämlich ruck zuck verarbeitet.

    Aber vll. sind es auch einfach viel zu viele Daten um das auf einen Rutsch einzulesen?

    Mortal2006 schrieb:

    Ich würde in dem Fall einfach nur anzeigen bei welchem Datensatz er gerade ist ...
    Als Anwender würde mir das als Information reichen 🙂

    Nur weißt du dann immer noch nicht, wie viel noch vor dir liegt.



  • Entschuldigt, habe gestern nicht mehr reingeschaut. Wow, sind das viele Antworten... 👍

    Also zum Aufbau der Daten:

    In der Dateiendung spiegeln sich die Menge der Daten wieder:

    .s2p = 2 Ports = 4 Paare komplexer Zahlen + 1 Frequenz, bei der sie auftreten.

    ! Das ist eine Kommentarzeile
    # GHz S RI R 50 
    
    1.500  0.0043 -0.625 0.0653 -0.085 0.3564 -0.7632 0.074 0.00432
    1.550  0.0343 -0.715 0.1743 -0.345 0.3444 -0.7192 0.042 0.02345
    .
    .
    .
    noch 19998 Datensätze...
    

    Ich lese das ungefähr so ein:

    float d0, d1, d2, d3, d4, d5, d6, d7, d8;
    
    std::string S;
    S.reserve(1024);
    
    while (!eof)
    {
        if ((S[0] != "#") && (S[0] != "!"))
        {
            getline(file, S);
            std::istringstream sin(S);
    
            sin >> d0;  // Frequenz
            sin >> d1;  // S11 real
            sin >> d2;  // S11 imaginaer
            sin >> d3;  // S12 real
            sin >> d4;  // S12 imaginaer
            sin >> d5;  // S21 real
            sin >> d6;  // S21 imaginaer
            sin >> d7;  // S22 real
            sin >> d8;  // S21 imaginaer
    
            SchiebeAllesInEinenVektor();
    
            m_pPointerAufProgressBar->StepIt();
        }
    }
    

    🙄
    Bitte nicht aufstöhnen, es gibt bestimmt effizientere Methoden, für Ratschläge bin ich jederzeit offen. Gibt es eine Möglichkeit, das effizienter einzulesen? Problem am Format ist - wie oben schon erwähnt - zwischen den Datenzeilen können immer noch beliebig viele Kommentarzeilen (mit "!" beginnend) stehen.


Anmelden zum Antworten