Hallo Leute,
ich habe eine Whileschleife(eine Task), die mir Daten auf einem XY-Plot darstellt. Habe schon öfters gelesen, dass man keine Arrays in While-Schleifen im Bezug auf die Speicherverwaltung von LV einsetzen soll, aber eine For-Schleife kann ich hier nicht einsetzten und XY-Plot kann nur Arrays darstellen. Im Screenshot seht ihr, dass die neuen Werte aus einer Queue ausgelesen werden und in ein Datenarray hinzugefügt. Der User kann die Grösse des Arraypuffers selbst einstellen, damit er selber entscheidet wieviele Daten er sehen will und selber auf die CPU-Auslastung und Speicherverbrauch achtet. Sobald also die Puffergrösse den eingestellten Wert überschreitet, wird der Puffer abgeschnitten. Auf dem XY-Plot wird der ganze Datenpuffer dargestellt, aber halt mit kleineren Frequenz als die Daten kommen (ich kann ja nicht meinen XY-Plot mit 400 Hz updaten, sonst hätte ich 100% CPU-Auslastung). Die letzte Case-Struktur ist für die Aufgabenstellung irrelevant, also einfach ignorieren.
Was könnt ihr mir vorschlagen? Soll ich da am besten gleich ein Array initialisieren und dann mit Replace Array Subset arbeiten. Oder gibt es was anderes bzw. besseres?
Danke, Eugen
P.S. ich habe es hier und nicht in Signaldartellung gepostet, weil meine Frage sich mehr auf die Speicherverwaltung bezieht.
<div align="left">Hallo, Eugen,
ich glaube, wir sind uns hier alle im Forum einig, dass LV-Memory-Managermäßig die Variante mit Array-initalisieren und Replace-Array-Subset die optimale ist.
Meine Erfahrung ist hier aber, dass das in der Realität nur bei sehr großen Arrays einen Einfluß hat. Ich weiss jetzt natürlich nicht, mit welchen Datenmengen du maximal rechnest. Bei mir treten in der Regel nur kleine Datenmengen auf (einige tausend), so dass ich hauptsächlich recht gnadenlos mit Build-Array-Funktionen arbeite.
MfG, Jens</div>
' schrieb:<div align="left">Hallo, Eugen,
ich glaube, wir sind uns hier alle im Forum einig, dass LV-Memory-Managermäßig die Variante mit Array-initalisieren und Replace-Array-Subset die optimale ist.
Meine Erfahrung ist hier aber, dass das in der Realität nur bei sehr großen Arrays einen Einfluß hat. Ich weiss jetzt natürlich nicht, mit welchen Datenmengen du maximal rechnest. Bei mir treten in der Regel nur kleine Datenmengen auf (einige tausend), so dass ich hauptsächlich recht gnadenlos mit Build-Array-Funktionen arbeite.
MfG, Jens</div>
Danke schon mal für die Antwort. Die Puffergrösse ist bei mir auf 10000 Datenpunkte begrenzt. Das mit Init und Replace ist mit schon klar, aber versuche es mal hier einzusetzen. Ich frage ja Arraygröße ab und diese ist bei vorinitialisierten Arrays gleich groß.
Eugen
' schrieb:Danke schon mal für die Antwort. Die Puffergrösse ist bei mir auf 10000 Datenpunkte begrenzt. Das mit Init und Replace ist mit schon klar, aber versuche es mal hier einzusetzen. Ich frage ja Arraygröße ab und diese ist bei vorinitialisierten Arrays gleich groß.
Eugen
Das geht hier doch auch, Du kannst dein Array mit NaNs initialisieren, die werden im Graphen nicht angezeigt. Die Arraygröße kannst Du in einem Shift-Register hochzählen. Eine weitere Optimierung wäre die Benutzung von SGL-Arrays statt DBL-Arrays (4 statt 8 Bytes) was für die Darstellung meistens völlig ausreicht.
VDB
' schrieb:Das geht hier doch auch, Du kannst dein Array mit NaNs initialisieren, die werden im Graphen nicht angezeigt. Die Arraygröße kannst Du in einem Shift-Register hochzählen. Eine weitere Optimierung wäre die Benutzung von SGL-Arrays statt DBL-Arrays (4 statt 8 Bytes) was für die Darstellung meistens völlig ausreicht.
VDB
Was meinst du mit NaNs?
Es sind schon Singles, sieht mal leider nicht.
Eugen
' schrieb:Was meinst du mit NaNs?
Es sind schon Singles, sieht mal leider nicht.
Eugen
NaN = Not A Number, wird bei Gleitkommazahlen benutzt um ungültige Ergebnisse darzustellen, z.B. dividieren durch 0. NaNs werden in Graphen und Charts nicht dargestellt.
VDB
Hallo, Eugen,
dass du ja bei deinem Bsp schon immer ein komplettes Array in den XY-Graphen schiebst, habe ich in der Eile mal wieder übersehen. Ansonsten, der Vorschlag von VDB hört sich doch sehr gut an. Habe ich zwar selber noch nicht probiert, werde ich aber bestimmt auch demnächst mal machen. Ansonsten, 10.000 Datenpunkte ist für LabVIEW eigentlich noch relativ harmlos.
Da wir jetzt schon fast beim Thema "große Datenmengen" sind, hier noch
ein Link von NI. Die dort verlinkte Bibliothek giga_LabVIEW.llb hatte ich mir auch irgendwann schon mal runtergeladen und angeschaut. Fand ich damals sehr interessant.
MfG, Jens
' schrieb:NaN = Not A Number, wird bei Gleitkommazahlen benutzt um ungültige Ergebnisse darzustellen, z.B. dividieren durch 0. NaNs werden in Graphen und Charts nicht dargestellt.
VDB
Das wusste ich ja schon. Ich meine dein Vorschlag. Kannst du mal was kleineres basteln, damit ich sehe was du meinst? Danke.
Ich habe mich oben falsch ausgedrückt. Ich habe gemeint was meinst du mit NaNs auffüllen und wozu? Was bringt mir das, wenn ich mein Array bei der Initialisierung mit NaNs auffülle? Und warum soll ich Arraygröße hochzählen?
Vielleich meinst du ich muss immer mein komplettes Array anzeigen, wobei der Rest(der mit NaNs aufgefüllt ist) vom XY-Plot sowieso nicht dargestellt wird. Was soll ich dann mit der X-Achsenskalierung machen? Denkst du nicht es wird viel zu kompliziert für diese Kleinigkeit?
Eugen
' schrieb:Das wusste ich ja schon. Ich meine dein Vorschlag. Kannst du mal was kleineres basteln, damit ich sehe was du meinst? Danke.
Ich habe mich oben falsch ausgedrückt. Ich habe gemeint was meinst du mit NaNs auffüllen und wozu? Was bringt mir das, wenn ich mein Array bei der Initialisierung mit NaNs auffülle? Und warum soll ich Arraygröße hochzählen?
Vielleich meinst du ich muss immer mein komplettes Array anzeigen, wobei der Rest(der mit NaNs aufgefüllt ist) vom XY-Plot sowieso nicht dargestellt wird. Was soll ich dann mit der X-Achsenskalierung machen? Denkst du nicht es wird viel zu kompliziert für diese Kleinigkeit?
Eugen
[
attachment=5818]
So in etwa... Die NaNs stören nicht bei der Darstellung im Graphen.
VDB
' schrieb:[attachment=32284:NaN_Array.vi]
So in etwa... Die NaNs stören nicht bei der Darstellung im Graphen.
VDB
Hm, irgendwie passt es schon. Nur muss man sich gut überlegen wie man es laufend macht. Also halt die gleiche Funktionalität wie bei mir im ersten Post. Ich meine wie macht man daraus einen richtigen RING-Puffer mit variabler Tiefe?
Eugen