INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Globale Daten eleminieren



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

26.09.2007, 13:47 (Dieser Beitrag wurde zuletzt bearbeitet: 08.12.2007 14:46 von jg.)
Beitrag #1

Xaran Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 200
Registriert seit: Jun 2006

LabView 2009
2006
en

80***
Deutschland
Globale Daten eleminieren
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)


Angehängte Datei(en)
Sonstige .vi  Graph_Neujil.vi (Größe: 207,67 KB / Downloads: 207)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
09.10.2007, 08:00
Beitrag #2

Michael5 Offline
LVF-Anwender
*


Beiträge: 45
Registriert seit: Jul 2006

7.0 bis Developer Suite 2012 DS2
2003
DE

72074
Deutschland
Globale Daten eleminieren
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
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
09.10.2007, 08:55
Beitrag #3

Xaran Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 200
Registriert seit: Jun 2006

LabView 2009
2006
en

80***
Deutschland
Globale Daten eleminieren
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.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
09.10.2007, 09:25
Beitrag #4

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
Globale Daten eleminieren
' 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

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
09.10.2007, 09:31
Beitrag #5

Xaran Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 200
Registriert seit: Jun 2006

LabView 2009
2006
en

80***
Deutschland
Globale Daten eleminieren
' 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?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
09.10.2007, 09:44
Beitrag #6

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
Globale Daten eleminieren
' 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

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
09.10.2007, 13:11
Beitrag #7

Michael5 Offline
LVF-Anwender
*


Beiträge: 45
Registriert seit: Jul 2006

7.0 bis Developer Suite 2012 DS2
2003
DE

72074
Deutschland
Globale Daten eleminieren
[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
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Globale Variablen Edi70 7 4.446 08.10.2021 17:01
Letzter Beitrag: GerdW
  Boolean als globale Variable ares2013 12 11.330 06.09.2019 13:57
Letzter Beitrag: GerdW
  globale Konstanten? Nordvestlys 6 5.896 20.02.2015 09:35
Letzter Beitrag: Nordvestlys
  Globale Variable, maximale Größe, Daten anhängen. dieseldunst 10 10.650 18.04.2014 09:00
Letzter Beitrag: Lucki
  Globale Variable mit Excel Banick 5 6.450 29.01.2014 11:44
Letzter Beitrag: Banick
  FGV Funktionale Globale Variable cabua 30 52.312 08.11.2013 10:33
Letzter Beitrag: mate Ria

Gehe zu: