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 

Speicher von genutztem Array freigeben



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!

06.05.2016, 19:23
Beitrag #1

moTo Offline
LVF-Grünschnabel
*


Beiträge: 10
Registriert seit: Apr 2016

2015
2015
EN



Speicher von genutztem Array freigeben
Hallo zusammen,

ich habe zwar schon einen Thread offen, dieser hier betrifft allerdings eine andere Frage:
Ich habe ein kleines Beispiel VI dazu erstellt und angehängt.
Ich erstelle in einer Schleife Bilder um sie dann in einem Array zu speichern. Das Array wird vorher initialisiert und auf 1000 Bilder beschränkt.

Nun macht die Kamera die Bilder und füllt den RAM auf, wenn ich aber das Array wieder lösche bzw mit Nullwerten belege, wird der Speicher nicht freigegeben. Erst nachdem ich LabVIEW komplett geschlossen habe, ist der Speicher wieder frei. Aus diesem Grund hatte ich schon desöfteren out of Memory Probleme, obwohl ich den Platz ja eigtl gar nicht benötige.

In meinem Haupt VI werden die Bilder danach per Tastendruck auf die Festplatte gespeichert und danach so wie in dem Beispiel VI gelöscht.
Offensichtlich mache ich aber irgendwas falsch Smile Wie bekomme ich also den Speicher frei?
Diese Art Referenzen müssen doch nicht geschlossen werden, oder?

Danke im Voraus für eure Rückmeldungen!

Beste Grüße,
moTo

Falls ihr jetzt keine Kamera da habt, könnte man ja alternativ auch ein extrem großes Array mit Zufallszahlen vollmachen..


Angehängte Datei(en)
15.0 .vi  ExampleVI.vi (Größe: 27,06 KB / Downloads: 210)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
06.05.2016, 20:13 (Dieser Beitrag wurde zuletzt bearbeitet: 06.05.2016 20:20 von GerdW.)
Beitrag #2

GerdW Offline
______________
LVF-Team

Beiträge: 17.465
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: Speicher von genutztem Array freigeben
Hallo moto,

Zitat:Offensichtlich mache ich aber irgendwas falsch
Ja, offensichtlich!

Zitat:Diese Art Referenzen müssen doch nicht geschlossen werden, oder?
Warum nicht? Jede Referenz sollte geschlossen werden - vor allem, wenn damit relativ viel Speicher belegt wird!
Genau das ist hier das Problem: IMAQ-Images sind eben nicht direkt Bilddaten, sondern nur Referenzen auf die Bilddaten. Und diese Referenzen werden von dir nicht geschlossen, sondern einfach mit neuen leeren Referenzen überschrieben!
Also: deinen Speicher freigeben, indem jede Referenz im Array mit IMAQClose freigegeben wird!

Zitat:Falls ihr jetzt keine Kamera da habt, könnte man ja alternativ auch ein extrem großes Array mit Zufallszahlen vollmachen..
Nein, so kann man das nicht nachstellen, da, wie oben gesagt, IMAQ-Images Referenzen auf die Bilddaten darstellen!

Weitere Fehler:
- Warum nutzt du nicht AutoCleanup? Dein BD würde mindestens um den Faktor 2 kleiner!
- Deine WhileLoop läuft 1001× durch, obwohl dein Array nur 1000 Referenzen enthalten soll (Test auf "i>=1000"!)…
- Warum initialisierst du dein Array mit 1000 leeren Referenzen, wenn diese in der Schleife danach von neuen Referenzen überschrieben werden?
- Warum keine FOR-Loop statt der While-Loop, wenn die maximale Iterationszahl schon vorher feststeht?
- Warum ein Schieberegister für dein Array? Warum nicht einen autoindizierenden Ausgangstunnel für die Array-Daten? Wenn dann am Ende keine 1000 Werte zusammenkommen, weil die Loop vorher abgebrochen wird, kannst du immer noch entsprechend viele leere Referenzen ans Array anhängen!
- Du hast eine RaceCondition beim Lesen der "Session Out" per PropertyNode! Warum überhaupt dieser Zugriff per Propertynode, wenn der Wert in SessionOut im VI selbst erstellt wird? "The wire keeps the value!"

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
07.05.2016, 08:12
Beitrag #3

moTo Offline
LVF-Grünschnabel
*


Beiträge: 10
Registriert seit: Apr 2016

2015
2015
EN



RE: Speicher von genutztem Array freigeben
Hallo GerdW,

vielen Dank erstmal für deine Antworten und dass du dir so viel Zeit dafür nimmst!

Zitat:Warum nicht? Jede Referenz sollte geschlossen werden - vor allem, wenn damit relativ viel Speicher belegt wird!
Genau das ist hier das Problem: IMAQ-Images sind eben nicht direkt Bilddaten, sondern nur Referenzen auf die Bilddaten. Und diese Referenzen werden von dir nicht geschlossen, sondern einfach mit neuen leeren Referenzen überschrieben!
Also: deinen Speicher freigeben, indem jede Referenz im Array mit IMAQClose freigegeben wird!
Die IMAQClose Funktion schließt aber nur Sessions, und keine IMAQ Bilder, bzw. der Input einer solchen Close Funktion ist immer eine Session. Die schließe ich am Ende der Aufnahme auch wieder, trotzdem bleibt der Speicher belegt.

Zitat:Weitere Fehler:
- Warum nutzt du nicht AutoCleanup? Dein BD würde mindestens um den Faktor 2 kleiner!
Hatte ich vergessen, sorry. Ich nutze das Auto Cleanup in meinem großen VI nicht mehr, da mir das Ergebnis zu unübersichtlich ist.

Zitat: - Deine WhileLoop läuft 1001× durch, obwohl dein Array nur 1000 Referenzen enthalten soll (Test auf "i>=1000"!)…
Ist mir auch aufgefallen, habe ich entsprechend korrigiert Smile

Zitat: - Warum initialisierst du dein Array mit 1000 leeren Referenzen, wenn diese in der Schleife danach von neuen Referenzen überschrieben werden?
Ich wusste ehrlich gesagt gar nicht, dass dabei nur Referenzen erstellt werden, dann nehm ich das mal aus meiner Initialize Funktion raus..

Zitat: - Warum keine FOR-Loop statt der While-Loop, wenn die maximale Iterationszahl schon vorher feststeht?
Stimmt, in diesem Beispiel wäre das besser gewesen, in meinem Haupt VI brauche ich eine While Loop, da dort das Ende idR unbestimmt ist.

Zitat: - Warum ein Schieberegister für dein Array? Warum nicht einen autoindizierenden Ausgangstunnel für die Array-Daten? Wenn dann am Ende keine 1000 Werte zusammenkommen, weil die Loop vorher abgebrochen wird, kannst du immer noch entsprechend viele leere Referenzen ans Array anhängen!
Ich habe in einem anderen Forum gelesen, dass es besser ist, ein Array vorher zu initialisieren und dann die replace Funktion zu benutzen, da es weniger Ressourcen benötigt. Ist dem nicht so?

Zitat: - Du hast eine RaceCondition beim Lesen der "Session Out" per PropertyNode! Warum überhaupt dieser Zugriff per Propertynode, wenn der Wert in SessionOut im VI selbst erstellt wird? "The wire keeps the value!"
Hier im Beispiel wäre es tatsächlich unnötig, in meiner State Machine wird die Kamera aber an anderer Stelle initialisiert und ich greife dann per Referenz auf die Session zu, da ich keine lokalen Variablen verwenden möchte.


Mir ist auch aufgefallen, dass der Arbeitsspeicher beim erneuten ausführen nicht noch größer wird, sofern man weniger Bilder als vorher erstellt. Daher scheint der Platz nicht wirklich belegt zu sein, sondern nur ,,reserviert'', oder was denkst du?

Danke und beste Grüße,
moTo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
11.05.2016, 10:07 (Dieser Beitrag wurde zuletzt bearbeitet: 11.05.2016 10:11 von rolfk.)
Beitrag #4

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: Speicher von genutztem Array freigeben
(07.05.2016 08:12 )moTo schrieb:  
Zitat:Warum nicht? Jede Referenz sollte geschlossen werden - vor allem, wenn damit relativ viel Speicher belegt wird!
Genau das ist hier das Problem: IMAQ-Images sind eben nicht direkt Bilddaten, sondern nur Referenzen auf die Bilddaten. Und diese Referenzen werden von dir nicht geschlossen, sondern einfach mit neuen leeren Referenzen überschrieben!
Also: deinen Speicher freigeben, indem jede Referenz im Array mit IMAQClose freigegeben wird!
Die IMAQClose Funktion schließt aber nur Sessions, und keine IMAQ Bilder, bzw. der Input einer solchen Close Funktion ist immer eine Session. Die schließe ich am Ende der Aufnahme auch wieder, trotzdem bleibt der Speicher belegt.

Falsch! Es gibt ein "IMAQdx Open Camera" und ein entsprechendes "IMAQdx Close Camera" (das Du auch nicht aufrufst!) und ein "IMAQ Create" und ein "IMAQ Dispose".

Zudem verwende doch bitte keine Property Nodes um Variablen zu verbinden. Das geht alles auch ganz ohne. LabVIEW verwendet dazu Wires und das funktioniert grossartig. Zudem haben Property Nodes seriösen Overhead der die Performance vermindert, deshalb nie verwenden wenn es nicht strikt notwendig ist. Dann erübrigt sich auch einiges an Sequence Frames da dann die korrekte Ablauffolge durch eben diese Wires schon gegeben ist.

   

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
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Speicher läuft in Statemachine voll (großes Array...) Peter04 5 7.729 30.11.2013 22:42
Letzter Beitrag: D_Sev
  Frage zu Melder/Queues freigeben Hasenfuss 4 6.448 27.03.2013 10:15
Letzter Beitrag: Hasenfuss
  "Initialize Array" allokiert Speicher 4-fach (Labview 2009 Win XP 32Bit) tinger 6 6.957 06.03.2012 11:44
Letzter Beitrag: tinger
  Tabelle: Speicher freigeben? danielsan 3 5.875 20.10.2009 10:30
Letzter Beitrag: IchSelbst
  array aus speicher entfernen billabong 12 12.777 16.07.2009 17:35
Letzter Beitrag: billabong
  String Array Werte (200 )in Datei speicher blitzgeist 1 2.847 13.06.2006 15:35
Letzter Beitrag: Kvasir

Gehe zu: