LabVIEWForum.de
Globale Daten eleminieren - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Globale Daten eleminieren (/Thread-Globale-Daten-eleminieren)



Globale Daten eleminieren - Xaran - 26.09.2007 13:47

Moin!

Ich bin gerade dabei, ein VI umzustricken, dass ein Vorgänger von mir geschrieben hat. Er nutzte dabei die "Totsünde" (wenn ich das richtig begriffen habe) der globalen Variablen. Da ich Musikdaten mit den VIs bearbeiten möchte, kommen doch recht schnell ordentliche Datenmengen zusammen und ich glaube, dass die globalen Variablen mit Schuld daran sind, dass ich in kürzester Zeit nur noch einen MB Ram frei und knapp 2GB Auslagerungsdatei besitze. Dass dann der Rechner langsam wird ist wohl kein Wunder.

Einige globale Variablen konnte ich schon rausschmeißen und das Programm dadruch übersichtlicher machen. Jetzt bin ich aber zu einem Sub-VI gekommen, in dem die globalen Variablen in einer Event-Struktur genutzt werden und ich bin mir unsicher, wie ich sie dort halbwegs elegant umgehen kann. Würde man ein Schieberegister nehmen? Da ich noch nie mit Events gearbeitet habe, bin ich da zur Zeit leider etwas hilflos...

Schöne Grüße

PS: Nicht wundern, dass das VI nicht ausführbar ist. Ich musst ein paar Graphen löschen, damit das VI kleiner wird ("clear graph" hat nix genützt). Aber das Problem der globalen Variablen kann man auch so schon sehen.

(VI LV 7.1)


Globale Daten eleminieren - Michael5 - 09.10.2007 08:00

Kann es sein, dass da noch andere VI's fehlen?
Wenn nicht ist es kein Problem aus den globalen Daten eine Schieberegister zu machen.
Du klickst auf den Rahmen deiner While-Schleife die um dein Event-Struct gelegt ist und fügst mit der rechten
Maustaste -> "Schiebereister hinzufügen" ein Schieberegister hinzu.
Dann nimmst du das Array "Daten interessante Stellen" aus deinem ersten Fach der Sequenz und schließt es an dieses Schieberegister außerhalb der Whileschleife an. Somit ist das Schieberegister fertig.
Nun musst du nur noch alle Verbindungen die in dem Event-Struct an der globalen Variablen angeschlossen sind mit den Ein- und Ausgängen dieses Schieberegister verbinden.

Wie das geht siehst du ja an deinem Fehlercluster der ebenfalls über ein Schieberegister die Fehlermeldungen in dem Eventregister weiterleitet.

Ich frage mich immer noch, aus welchem Grund hier eine Globale Variable verwendet wurde? Da ist doch noch irgend etwas im Busch.
Zum Speicherverbrauch ist zu sagen, dass die Datenmenge gleich bleibt.
Ich kenne keinen Grund warum viele Daten weniger werden sollen, wenn diese in einem Schiebereister oder in einer globalen Variablen im Speicher liegen. Sie werden halt ein wenig anders behandelt. Aber 2GB bleiben 2GB.

Gruß Michael


Globale Daten eleminieren - Xaran - 09.10.2007 08:55

Stimmt. 2GB bleiben 2GB, aber wenn die Daten im Verlauf des Programms nicht mehr benötigt werden, macht es Sinn sie auch zu löschen, was so wie die globalen Daten bisher gehandhabt wurden nicht geschah. Dadurch wurde viel "alter Krempel" mitgeschliffen, welcher den RAM zumüllte.

>Nun musst du nur noch alle Verbindungen die in dem Event-Struct an der globalen Variablen angeschlossen sind mit den Ein- und Ausgängen >dieses Schieberegister verbinden.
Scheint also doch einfacher zu sein als gedachtSmile(also keine Angst mehr vor Events...)

Das Problem des angefügten VIs hat sich in sofern erledigt, als dass ich dort die globale Variable so lasse wie sie ist. Sie enthält kaum Datenmengen (so max. 10 kurze Strings und das ist ja heutzutage vernachlässigbar) und ist für den weiteren Programmverlauf (da sie an verschiedenen Stellen immer wieder genutzt wird) recht praktisch. (Da alles umzuändern würde die Zeit/Nutzen Relation gehörig sprengen).

Was die Speicherbelegung so hochtreibt sind die Anzeigen. Das lässt sich mithilfe von GigaLab (von der NI-Homepage) anscheinend beheben, indem dafür gesorgt wird, dass auch nur so viele Datenpunktee angezeigt werden, wie auch angezeigt werden können. Vielleicht werde ich das später mal implementieren, aber das mach ich, wenn ich mal Zeit über habeWink

Ich konnte im Rest des Programms ein bisschen was optimieren, sodass sich erstmal ganz passabel damit arbeiten lässt.


Globale Daten eleminieren - rolfk - 09.10.2007 09:25

' schrieb:Kann es sein, dass da noch andere VI's fehlen?
Wenn nicht ist es kein Problem aus den globalen Daten eine Schieberegister zu machen.
Du klickst auf den Rahmen deiner While-Schleife die um dein Event-Struct gelegt ist und fügst mit der rechten
Maustaste -> "Schiebereister hinzufügen" ein Schieberegister hinzu.
Dann nimmst du das Array "Daten interessante Stellen" aus deinem ersten Fach der Sequenz und schließt es an dieses Schieberegister außerhalb der Whileschleife an. Somit ist das Schieberegister fertig.
Nun musst du nur noch alle Verbindungen die in dem Event-Struct an der globalen Variablen angeschlossen sind mit den Ein- und Ausgängen dieses Schieberegister verbinden.

Wie das geht siehst du ja an deinem Fehlercluster der ebenfalls über ein Schieberegister die Fehlermeldungen in dem Eventregister weiterleitet.

Ich frage mich immer noch, aus welchem Grund hier eine Globale Variable verwendet wurde? Da ist doch noch irgend etwas im Busch.
Zum Speicherverbrauch ist zu sagen, dass die Datenmenge gleich bleibt.
Ich kenne keinen Grund warum viele Daten weniger werden sollen, wenn diese in einem Schiebereister oder in einer globalen Variablen im Speicher liegen. Sie werden halt ein wenig anders behandelt. Aber 2GB bleiben 2GB.

Gruß Michael

Da ist eben schon ein Unterschied. Das LEsen von globalen Variablen macht IMMER eine Kopie der ganzen Daten auch wenn Du dann mit einem Index Array ein einziges Element herauspickst um damit etwas zu tun.

Das Schieberegister dahingegen kann durch LabVIEW oft sehr gut optimalisiert werden. Im Falle wo Du ein 100MB Array durch alle Case- (oder Event-) Strukturen führst und dann irgendwo ein Index Array machst ist LabVIEW schlau genug um nur den Teil aus dem Array herauszukopieren der von Index Array referenziert wird. Bei Verwendung einer Globalen macht LabVIEW erst mal eine 100MB Kopie um dann das interessante Teil herauszukopieren und die 100MB Kopie danach wegzuschmeissen.

Und nein LabVIEW kann nicht einfach Global Access optimalisieren. Da kommen Dinge wie concurrent access, multithreading, collisions und so weiter ins Spiel die eben bei einer globalen Variablen nicht einfach so zu managen sind. Bei einem Schieberegister ist durch Dataflow dagegen genau definiert wer wann und wie Zugriff zu den Daten hat und kann LabVIEW eben wirklich optimalisieren.

Rolf Kalbermatter


Globale Daten eleminieren - Xaran - 09.10.2007 09:31

' schrieb:Da ist eben schon ein Unterschied. Das Lesen von globalen Variablen macht IMMER eine Kopie der ganzen Daten auch wenn Du dann mit einem Index Array ein einziges Element herauspickst um damit etwas zu tun.

Das Schieberegister dahingegen kann durch LabVIEW oft sehr gut optimalisiert werden. Im Falle wo Du ein 100MB Array durch alle Case- (oder Event-) Strukturen führst und dann irgendwo ein Index Array machst ist LabVIEW schlau genug um nur den Teil aus dem Array herauszukopieren der von Index Array referenziert wird. Bei Verwendung einer Globalen macht LabVIEW erst mal eine 100MB Kopie um dann das interessante Teil herauszukopieren und die 100MB Kopie danach wegzuschmeissen.

Und nein LabVIEW kann nicht einfach Global Access optimalisieren. Da kommen Dinge wie concurrent access, multithreading, collisions und so weiter ins Spiel die eben bei einer globalen Variablen nicht einfach so zu managen sind. Bei einem Schieberegister ist durch Dataflow dagegen genau definiert wer wann und wie Zugriff zu den Daten hat und kann LabVIEW eben wirklich optimalisieren.

Rolf Kalbermatter

Danke für diese Antwort. Ich glaube das nun verstanden und auch beobachtet zu haben. Aller Speicherintensiven Array etc laufen bei mir auch nicht mehr über eine globale Variable (welche auch wirklich immer und überall zum Lesen hergenommen wurde), sondern nur noch dieses eine kleine String Array (was ich nach wie vor auch mit 500 Kopien als vernachlässigbar betrachteWink).

Auf jeden Fall eine gute Warnung, nix großes global zu handhaben, oder?


Globale Daten eleminieren - rolfk - 09.10.2007 09:44

' schrieb:Danke für diese Antwort. Ich glaube das nun verstanden und auch beobachtet zu haben. Aller Speicherintensiven Array etc laufen bei mir auch nicht mehr über eine globale Variable (welche auch wirklich immer und überall zum Lesen hergenommen wurde), sondern nur noch dieses eine kleine String Array (was ich nach wie vor auch mit 500 Kopien als vernachlässigbar betrachteWink).

Auf jeden Fall eine gute Warnung, nix großes global zu handhaben, oder?

Ich habe einige Faustregel beim LabVIEW Programmieren.

1) Keine globalen Variablen verwenden (Ausnahme manchmal bei skalaren Variablen (eine Zahl, Boolean) aber meist sind das eher quick and dirty Programme dann wirkliche Applikationen)
2) Keine lokalen Variablen ausser bei User Interfaces um beim Start davon Kontrolls zu initialisieren
3) Für alles andere verwende ich LV2 Style globals, das sind subVIs mit einem uninitialisierten Schieberegister in einer Loop, einem Case in dieser Loop und ein enum als Selector welche Case Struktur ausgeführt werden soll. Im einfachsten Fall ist das ein Read und Write case aber meist wird das bei mir schnell etwas komplizierter.

Bei Fremdprogrammen sehe ich über die Verwendung von Globalen hinweg, wenn sie nicht für Arrays oder grosse Strings sind UND wenn sichergestellt ist dass sie nicht Race-Conditions verursachen können. Ansonsten mein Urteil: :flop:und Mülleimer.

Rolf Kalbermatter


Globale Daten eleminieren - Michael5 - 09.10.2007 13:11

[quote name='rolfk' date='09.10.2007 , 10:25:29' post='37870']
Da ist eben schon ein Unterschied. Das LEsen von globalen Variablen macht IMMER eine Kopie der ganzen Daten auch wenn Du dann mit einem Index Array ein einziges Element herauspickst um damit etwas zu tun.

Ups! Das ist absolut richtig.
Gut darüber gesprochen zu haben.
Gruß Michael