LabVIEWForum.de
Statemachine zur Erfassung von Messdaten nach ein paar tausend Messwerten sehr langsa - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Statemachine zur Erfassung von Messdaten nach ein paar tausend Messwerten sehr langsa (/Thread-Statemachine-zur-Erfassung-von-Messdaten-nach-ein-paar-tausend-Messwerten-sehr-langsa)



Statemachine zur Erfassung von Messdaten nach ein paar tausend Messwerten sehr langsa - nemesismf - 19.09.2011 10:01

Hallo,

Zur Prüfung von Messmodulen (Strom, Spannung) verwende ich eine State Machine, die die Messwerte in Arrays speichert. Die Arrays (Messwertarray (double), Ausgabearray (string)) werden von Schieberegistern immer wieder zum Anfang der State Machine gegeben und im Verlauf aktualisiert bzw. erweitert.
In einem State "Auswertung", den alle Messvorgänge durchlaufen, wird die Nutzeroberfläche mit den Messdaten versorgt (per Referenzen und Eigenschaftsknoten).

Ich habe nun das Problem, daß ein einfacher Durchlauf einer Messung (Ausgabe durch Messgerät --> Messen mit Modul --> Auswerten) am Anfang ca. 60ms dauert. Im Verlauf einer ganzen Messreihe (bis zu 100k Messungen) wird das ganze unerträglich langsam.
Ich vermute, daß es mit dem Schieben, Erweitern und Anzeigen der Arrays zusammenhängt. Allerdings sollen die Messdaten während der Messung in der Tabelle sichtbar sein und auch im Verlauf der Messung im dem Graph angezeigt werden. Sonst könnte man die Auswertung ganz am Schluss machen und sich einen Haufen Aufwand sparen.

Über Tipps, Hinweise oder Beispiele würde ich mich freuen.

Leider darf ich wegen Geheimhaltung das VI nicht posten :-(
... ein paar Bilder sind aber erlaubt.

Vielen Dank für eure Mühe

Mirko


RE: Statemachine zur Erfassung von Messdaten nach ein paar tausend Messwerten sehr langsa - jg - 19.09.2011 10:21

Du hast mehrere Probleme:

1) Ja, dauerndes Vergrößern von Arrays ist ungünstig, da dauernd neuer Speicher alloziert werden muss.
2) Aber einer gewissen Menge von Datenpunkten braucht ein Graph immer länger zum Darstellen der Daten. Das Ganze muss ja gerendert werden. Wie oft macht du diese Updates? Je häufiger, desto schlechter für die Performance.
3) Ganz schlimm ist, dass du alle Werte per PropertyNode setzt. Das Schreiben von PropertyNodes erfolgt nämlich im UI-Thread, und jedes Schreiben löst auch zwingend ein Update des FP aus.

Gruß, Jens


RE: Statemachine zur Erfassung von Messdaten nach ein paar tausend Messwerten sehr langsa - nemesismf - 19.09.2011 10:58

>>1) Ja, dauerndes Vergrößern von Arrays ist ungünstig, da dauernd neuer Speicher alloziert >>werden muss.
werde ich ändern, so daß gleich das komplette Array initialisiert wird und die entsprechende Stelle wird später nur ersetzt.
>>2) Aber einer gewissen Menge von Datenpunkten braucht ein Graph immer länger zum >>Darstellen der Daten. Das Ganze muss ja gerendert werden. Wie oft macht du diese Updates? >>Je häufiger, desto schlechter für die Performance.
Die Updates werden nach jedem Messdurchgang ausgeführt. D.h. typischerweise 30k-65k in einer Messreihe. Es ist sozusagen günstiger nur die letzten ~ 5000k Messwerte anzuzeigen (mehr als 10k geht sowieso nicht)
>>3) Ganz schlimm ist, dass du alle Werte per PropertyNode setzt. Das Schreiben von >>PropertyNodes erfolgt nämlich im UI-Thread, und jedes Schreiben löst auch zwingend ein >>Update des FP aus.
Wie würdest du die Messwerte für das Userinterface aktualisieren / anzeigen (Link, Beispiel, Bild wenn möglich)?

Danke schön

Mirko


RE: Statemachine zur Erfassung von Messdaten nach ein paar tausend Messwerten sehr langsa - jg - 19.09.2011 11:03

(19.09.2011 10:58 )nemesismf schrieb:  Wie würdest du die Messwerte für das Userinterface aktualisieren / anzeigen (Link, Beispiel, Bild wenn möglich)?
Ganz klar besser ist die Verwendung einer lokalen Variable, besser noch des Terminalanschlusses selber.

Gruß, Jens


RE: Statemachine zur Erfassung von Messdaten nach ein paar tausend Messwerten sehr langsa - chrissyPu - 20.09.2011 09:10

Hi,

ich hab sowas mal mit ner Producer-Consumer-Struktur gemacht: Producer liest die Daten ein, Consumer speichert die Daten aus der Queue. Die Bildschirmanzeige wird dann nach dem Speichern in festgelegten Intervallen gemacht - 5 Hz reichen da z.B. vollkommen. Dazu lese ich die Daten aus der gespeicherten Datei ein. Wenn man das ganze über die Pfadzuordnung verbindet, hat man auch einen eindeutigen zeitlichen Ablauf. Die Anzeige wird dann nur alle paar Speicherungen getriggert.

Über die Speicherausnutzung kann man streiten, gibt es sicher noch die eine oder andere Optimierungsmöglichkeit. Funzt aber so, auch für längere Messungen und mehrere 100000 Werte... Snippet anbei, Größe ist der Autoaufräumen-Funktion zu verdanken...

Grüße,

ch

Snippet, LV2011
[attachment=35999]