Progressbar und Zeiteffizienz
-
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 reichenNur 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.