| |
|
|
- Seite 1 - |
|
KHR | Hallo miteinander,
.
ich möchte eine große Menge Meßdaten aufbereiten und dann als Kurve(n) darstellen. Die Daten werden aus einer Datei eingelesen und in Arrays zwischengelagert
Um stark flackernde Meßwerte in einer übersichtlichen Kurve darstellen zu können möchte ich diese über Durchschnittsbildung beruhigen Das ganze soll dann im fertigen Programm für fünf zahlenreihen gehen
Bisher mache ich das in etwas so:
Es gibt 5 arrays mit 100 elementen Float-Variablen , bei beginn mit 0 gefüllt
Ein Satz Meßwerte wird eingelesen, Jedes Array erhält ein Element eingetragen
Für jedes Array wird der Durchschnitt ermittelt,
die jeweiligen Punkte werden geplottet
und weiter geht es mit dem nächsten Datensatz Meßwerte.
Da ich bisher den Durchschnitt mit while-wend Schleifen errechne, wird alles unendlich langsam. Selbst mit Profan2cpp dauert es Minuten bis der Schirm vollgekritzelt ist.
Hier mal ein ganz kurzer Auszug der Daten wie sie vorliegen. Real haben die Dateien oft über zehn- oder gar zwanzigtausend Datensätze (Zeilen)
25.07.2007;08:22:53;1874;63.3;0.019387;0.023140;0.024151;0.022312;-----;----- 25.07.2007;08:22:54;1871;63.3;0.028538;0.022725;0.025337;0.022793;-----;----- 25.07.2007;08:22:55;1914;63.3;0.024311;0.023610;0.022366;0.022739;-----;----- 25.07.2007;08:22:56;1889;63.3;0.021887;0.023453;0.019952;0.022303;-----;----- 25.07.2007;08:22:57;1895;63.3;0.027712;0.023644;0.021144;0.022193;-----;----- 25.07.2007;08:22:58;1902;63.3;0.023383;0.023765;0.022752;0.022195;-----;----- 25.07.2007;08:22:59;1891;63.3;0.026178;0.023538;0.022319;0.022224;-----;----- 25.07.2007;08:23:00;1912;63.3;0.024255;0.023965;0.021904;0.022195;-----;----- 25.07.2007;08:23:01;1898;63.3;0.021041;0.023673;0.024442;0.022237;-----;----- 25.07.2007;08:23:02;1895;63.3;0.024243;0.023550;0.022202;0.022322;-----;----- 25.07.2007;08:23:03;1919;63.3;0.029875;0.023874;0.022494;0.022521;-----;----- 25.07.2007;08:23:04;1930;63.3;0.027768;0.024126;0.022018;0.022461;-----;----- 25.07.2007;08:23:05;1914;63.3;0.020411;0.023905;0.020469;0.022334;-----;----- 25.07.2007;08:23:06;1915;63.3;0.027465;0.023837;0.023016;0.022474;-----;----- 25.07.2007;08:23:07;1924;63.3;0.020727;0.023959;0.023631;0.022536;-----;----- 25.07.2007;08:23:08;1891;63.3;0.020876;0.023436;0.021933;0.022374;-----;----- 25.07.2007;08:23:09;1867;63.3;0.020627;0.023159;0.020591;0.022087;-----;----- .... Die ersten beiden Spalten Datum und Zeit sind uninteressant, erst danach gehts richtig los.
Vor lauter Frust über meine Ideenlosigkeit hab ich die bisherigen Codes gelöscht Hat da jemand ne Idee, wie so was schneller gehen könnte??
Bin halt leider doch kein Programmierer sondern nur ein Profan-Wurschtler. |
|
|
| Gruß Karl-Heinz WIN XP home/Pro / XPROFAN 11 / P2CPP ATMEL + BASCOM Fan | 03.06.2008 ▲ |
|
|
|
|
| |
|
- Seite 2 - |
|
Thomas Freier | @Frank, dann spende uns doch bitte die Mittelwert-Funktion einer Spalte (max., min. und Summe haben wir ja schon). Und wenn möglich eine Funktion, die die Anzahl der mit Werten gefüllten Items einer Spalte ermittelt. |
|
|
| |
|
|
|
| Hier der Source zum Bild...
Beinhaltet eine Funktion createHPicByStats(data$,xx,yy) und liefert ein Bildhandle der Statistik zurück. Die Ausgabegrösse kann per Pixel xx und yy eingestellt werden. Mit der Funktion kann man auch zur Laufzeit per String solch ein Diagramm erzeugen. Im Titel steht die Anzahl der benötigten Millisekunden.
Orginalcode: [...]
Ohne xpse KompilierenMarkierenSeparierenWINDOW 100,100 - 700,500
CLS $888888
var TME&=&GETTICKCOUNT
var HPIC&=CREATEHPICBYSTATS(FILE_GET_CONTENTS(fme-300-test.txt),600,420)
SETTEXT %HWND,STR$(&GETTICKCOUNT-TME&)+ ms
DRAWPIC HPIC&,10,10;0
USERMESSAGES $0014
WHILE 1
WAITINPUT
ENDWHILE
end
proc CREATEHPICBYSTATS
PARAMETERS S$,XX&,YY&
DECLARE LN$[],HDR$[],ENTI$[]
LN$[]=EXPLODE(S$+
,
)
var C&=SIZEOF(LN$[])
HDR$[]=EXPLODE(LN$[0],;)
var HDRC&=SIZEOF(HDR$[])
var F!=0
var F2!=0
DECLARE VMIN![HDRC&],VMAX![HDRC&],V![HDRC&,C&],VMM![HDRC&],COL&[IF(HDRC&>7,HDRC&,8)],COLB&[HDRC&],OLDF![HDRC&]
MAT VMIN![]=999999999999999
MAT VMAX![]=-999999999999999
DEC HDRC&
DEC C&
COL&[0]=$FF0000
COL&[1]=$00FF00
COL&[2]=$0000FF
COL&[3]=$880000
COL&[4]=$008800
COL&[5]=$000088
COL&[6]=$FF8800
COL&[7]=$00FF88
var CL&=0
WHILE 1
INC CL&
IFNOT CL&<C&
BREAK
ENDIF
ENTI$[]=EXPLODE(LN$[CL&],;)
SETSIZE ENTI$[],HDRC&+1
WHILELOOP 0,HDRC&
F!=VAL(ENTI$[&LOOP])
V![&LOOP,CL&]=F!
IF VMIN![&LOOP]>F!
VMIN![&LOOP]=F!
ENDIF
IF VMAX![&LOOP]<F!
VMAX![&LOOP]=F!
ENDIF
ENDWHILE
ENDWHILE
var I&=0
var A!=0
WHILELOOP 0,HDRC&
VMM![&LOOP]=(VMAX![&LOOP]-VMIN![&LOOP])
A!=V![&LOOP,1]
F!=VMM![&LOOP]
IF F!=0
CONTINUE
ENDIF
F2!=A!-VMIN![&LOOP]
IF F2!=0
CONTINUE
ENDIF
OLDF![&LOOP]=(F2!/F!*YY&)
ENDWHILE
var Y!=0
var HOP!=C&/XX&
var XH!=1
var YYHOP!=YY&*0.1
var X&=0
var HPIC&=CREATE(hNewPic,XX&,YY&,$FFFFFF)
STARTPAINT HPIC&
WHILE 1
INC X&
WHILELOOP 0,HDRC&
F!=VMM![&LOOP]
IFNOT F!=0
F2!=V![&LOOP,XH!]-VMIN![&LOOP]
IFNOT F2!=0
F!=(OLDF![&LOOP]*0.9)+(F2!/F!*YYHOP!)
ELSE
F!=(OLDF![&LOOP]*0.9)
ENDIF
USEPEN 0,0,COL&[&LOOP]
LINE (X&-1),(YY&-OLDF![&LOOP]) - (X&),(YY&-F!)
OLDF![&LOOP]=F!
ENDIF
ENDWHILE
XH!=XH!+HOP!
IF XH!>C&
BREAK
ENDIF
ENDWHILE
ENDPAINT
RETURN HPIC&
endproc
proc FILE_GET_CONTENTS
PARAMETERS FLE$
var B&=FILESIZE(FLE$)
IF B&<1
RETURN
ENDIF
DECLARE MEM#
DIM MEM#,B&
var R&=BLOCKREAD(FLE$,MEM#,0,B&)
var S$=CHAR$(MEM#,0,R&)
DISPOSE MEM#
RETURN S$
endproc
proc FILE_PUT_CONTENTS
PARAMETERS FLE$,S$
var L&=LEN(S$)
IF L&=0
var FH&=ASSIGN(FLE$)
REWRITE FH&
CLOSE FH&
ASSIGN FH&,
RETURN
ENDIF
DECLARE MEM#
DIM MEM#,L&+1
STRING MEM#,0=S$
BLOCKWRITE FLE$,MEM#,0,L&
DISPOSE MEM#
endproc
proc RGB.MIX
PARAMETERS COL1&,COL2&,TRANSL!
RETURN RGB(GETRVALUE(COL1&)*(1-TRANSL!)+GETRVALUE(COL2&)*(TRANSL!),GETGVALUE(COL1&)*(1-TRANSL!)+GETGVALUE(COL2&)*(TRANSL!),GETBVALUE(COL1&)*(1-TRANSL!)+GETBVALUE(COL2&)*(TRANSL!))
endproc
end
Wenn ich jetzt bedenke das diese Methode auch Spalte 1 und Spalte 2 mitberechnet (aber hier keine Zahlen findet) dann könnte ich mir vorstellen, dass mit kleiner Optimierung zu diesem Punkt vielleicht sogar 4 bis 5 statt 6,8 Sekunden erreicht werden können.
@KHR: Wie lange benötigt der Algo für die komplette Datei? |
|
|
| |
|
|
|
| He typisch - auf meinem Notebook mit 2,4GHz sogar nur 6.2 Sekunden, statt wie auch meinem DesktopPC mit 3,2 GhZ 6.8 Sekunden. Hat noch jemand nen 486dx4/100 herumzugammeln? |
|
|
| |
|
|
|
Thomas Freier | Ein schnell zusammengestrickter Test über eine doWhile- Schleife ist auch nicht gerade langsam (hier nur für 4 Reihen mit Mittelwert/sec und über eine *.dbf) . |
|
|
| |
|
|
|
| Es sieht so aus als ob Du die Skalen nicht normalisierst - bekommst das noch fix eingebaut?
Und für einen Performancevergleich wäre es imho nötig alle 10 Spalten zu beachten. (Das macht mein Beispiel auch, obwohl es bei Datum und Zeit natürlich nur 0 evaluiert und nutzt.)
Also Skalen normalisieren (x und y) und alle Spalten beachten und dann: Dauer preisgeben für Codeperformancevergleich. |
|
|
| |
|
|
|
Thomas Freier | @iF: aus Zeitgründen habe ich es bei 6 Werten belassen. Die Hauptzeit wird beim Erstellen der *.dbf verbraten. Hier wäre ein Vergleich zum Listview oder GridBoxen noch interessant. Die Skalierung, wenn ich sie richtig hinbekommen habe, kostet ca. 300ms bei einer Endzeit von 3734 ms. Auf meinem Rechner liegen beide Anwendungen sicher auf gleicher Höhe, wenn die weiteren 4 Werte dazu kommen. |
|
|
| |
|
|
|
| Hm, irgendwas stimmt nicht mit der Normalisierung - die muss automatisch bestimmt werden für jede Spalte separat. Beispielsweise hast Du eine schwarze Linie in der Mitte, die ist sozuagen nicht auf das ganze Y-Spektrum angezeigt. Eine Umrechnung zur einer einstellbaren Ausgabegröße fehlt da auch noch drin. ^^ |
|
|
| |
|
|
|
Thomas Freier | @ iF: die schwarze Linie ist die Temperatur (in fme-300-test.txt ist max=64.8° - min=63.9°) . Bei meiner Skalierung entspricht 1° = 13.9 Punkte. Mehr Ausschlag kommt da nicht raus. Seine Temperaturanzeige geht von 44° bis 80°. Da hilft nur eine filigranere Grafik wie bei dir. War aber nicht mein Ziel . |
|
|
| |
|
|
|
| Ich sah grad das ich oben den falschen Code gepostet hatte, das war eine Vorversion.
Der Orginalcode unter [...] war/ist jedoch der richtige.
Ich habe den ohne xpse-Code oben korrigiert - jetzt stimmts mit Exe und Screenshot überein.
KHR hätte es auffallen müssen. |
|
|
| |
|
|
| |
|
- Seite 3 - |
|
|
KHR | Hallo miteinander,
zuerst mal vielen Dank für Eure Mühe und sorry, daß ich toter Mann speile.
Ich bin momentan beruflich unterwegs und habe durch ungünstige Umstände nur sehr begrentzen Zugang zum Internet und auch zu meinem Notebokk, da es dauernd an der Anlage eines Kunden hängt und eifrig Daten mitschreiben muß
Ich melde mich wieder, wenn ich wieder Normalzustand habe.
Dankeschön und schöne Grüße |
|
|
| Gruß Karl-Heinz WIN XP home/Pro / XPROFAN 11 / P2CPP ATMEL + BASCOM Fan | 09.06.2008 ▲ |
|
|
|
|
Thomas Freier | Hmm iF, irgendwie sind die Kurven von showdata2.exe nicht nachvollziehbar. |
|
|
| |
|
|
|
| Hat Dein Dateianhang irgendwas mit ShowData2.Exe zu tun? (Weil mir das nicht so scheint...)
Bezüglich nicht nachvollziehbar - inwiefern?
Die davon erzeugten Kurven [...] . |
|
|
| |
|
|