LabVIEWForum.de - Wie Speicherverbrauch minimieren?

LabVIEWForum.de

Normale Version: Wie Speicherverbrauch minimieren?
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo zusammen,

ich habe folgendes VI, das fortlaufend durchlaufen wird.

[attachment=27863]

Ich suche aus mehreren Signalen 2 bestimmte damit heraus.
Der Speicherverbrauch ist laut LabVIEW-Speichermonitor (oder wie sich das nennt) gigantisch. Nach wenigen Sekunden ergibt sich das folgende Bild (Sample-Rate = 1,6 kHz):

[attachment=27864]

Was verursacht diesen hohen Speicherverbrauch? Laut Windows-Taskmanager sind es nur wenige MB, wobei man sich auf den nicht verlassen kann.
Die Daten werden doch nach der Ausführung des VIs wieder aus dem Speicher entfernt (= lokale Variablen), dachte ich.

Gibt es irgendwo Tipps/Tutorials, die man bzgl. Speichermanagement oder auch Performance beachten sollte?
Also häufig verwendete Konstrukte (Werte in Array einfügen, Messwerte vearbeiten, ...), evtl. mit Negativ- und Positivbeispiel?

Wenn man z.B. sämtliche Variablen als Referenz übergeben könnte (ohne umständliches "Referenz erstellen" und diese Inline-Elementstruktur etc), wäre mir vielleicht schon geholfen, aber sicher bin ich mir nicht.
In der LV Hilfe gibt es jede Menge zu diesem Thema. Was mir direkt ins Auge gefallen ist, ist der Indicator Kraft-Weg-Signal. Ziehe den mal aus deinem Case heraus (ist sonst noch irgendeine Struktur die auf dem Bild nicht zu sehen ist?). Dadurch vermeidest du eine Kopie des Wertes.
Hi,

wenn ich es so richtig im Hinterkopf habe, legt LV bei Zugiffen auf ein Array eine Kopie des jeweiligen Arrays an. Somit wird sich das wohl kaum ändern lassen. Wie groß sind denn deine Arrays?

Bin aber sehr gespannt was die Gurus hier von sich geben.

Keep on rockin, RMR
' schrieb:Hi,

wenn ich es so richtig im Hinterkopf habe, legt LV bei Zugiffen auf ein Array eine Kopie des jeweiligen Arrays an. Somit wird sich das wohl kaum ändern lassen. Wie groß sind denn deine Arrays?

Bin aber sehr gespannt was die Gurus hier von sich geben.

Keep on rockin, RMR
Das ist so nicht richtig.
Wenn dein Array Control und dein Array Indicator auf der Blockdiagram Route liegen, wird der Speicher des Aufrufenden VIs mitverwandt. Es wird keine explizite Kopie erstellt.
Hallo ihr beiden!

@abrissbirne: Stimmt, bei jedem Eingang einer Case-Struktur legt LabVIEW vermutlich eine Kopie der Daten an. Dann ziehe ich sämtliche Daten in die Case-Struktur hinein und lasse nur noch den Fehlereingang draußen.

@RMR: Puh, gute Frage. Es ist ein recht umfangreiches Cluster und das enthält 2 Messreihen, die über paar Sekunden aktuell mit 1,6 kHz gefüllt werden. Das ist aber eher ein Test, um solche Speicherproblemchen zu finden.
' schrieb:Hallo ihr beiden!

@abrissbirne: Stimmt, bei jedem Eingang einer Case-Struktur legt LabVIEW vermutlich eine Kopie der Daten an. Dann ziehe ich sämtliche Daten in die Case-Struktur hinein und lasse nur noch den Fehlereingang draußen.
Und das ist genau falsch! Du musst alle Controls und Indicators ausßerhalb der Casestruktur auf die Blockdiagram Route legen (siehe vorheriger Post).
Die, die ich in der Case-Struktur nicht benötige ja.
Aber auch die, auf die ich innerhalb der case-Struktur zugreifen möchte?

Nehmen wir das folgende VI. Ist hier der untere Weg besser?

[attachment=27870]
Ja, nur schon weil du im Fehlerfall den Wert des Eingangs anstatt eines Default-Wertes weitergibst (betrachte ich als VorteilWink)
Hm ok, dann ziehe ich das in meiner VI-Sammlung mal alles da raus. Unsure
' schrieb:Nehmen wir das folgende VI. Ist hier der untere Weg besser?
[attachment=56615:vi.PNG]
Jup, dadurch wird der Speicher des Aufrufenden VIs verwandt. Wenn du nun Arrayoperationen anwendest machst du es ganauso, nimmst für die Operationen die Inplace Elementstruktur und hast es optimal (Speicherbedarf) gelöst.
Seiten: 1 2
Referenz-URLs