LabVIEWForum.de
Problem mit Speicherauslastung - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Problem mit Speicherauslastung (/Thread-Problem-mit-Speicherauslastung)



Problem mit Speicherauslastung - vogster - 10.09.2009 16:34

Hallo Forum,

ich habe das Problem, dass sich der Speicher meines LabVIEW - Programms im Taskmanager stetig erhöht.
Führe ich das Programm direkt in der Entwicklungsumgebung (LV 2009) aus, dann erhöht sich der Wert um ca. 2.400kb pro Minute.
Starte ich das Programm als EXE, dann sind es immer noch 1.900kb pro Minute.

Das Programm ist sehr umfangreich, es besteht aktuell schon aus 270 einzelnen VI´s. Die Entwicklung ist auch noch nicht abgeschlossen.

Aufgrund dieses Eintrags habe ich dann die Leistungs- und Speicherüberwachung
unter Werkzeuge -> Profil -> Leistung und Speicher ausgeführt. Zunächst für 60 Sekunden und dann für 120 Sekunden. Die Ergebnisse habe in Excel
kopiert (1600 Zeilen pro Messung) und verglichen.
Lediglich ein VI hat sich in dieser Minute um 19kb (Spalte Max.Byte) "aufgeblasen". Das ist auch plausibel, in diesem VI wurde ein Array um einige Zeile ergänzt.
Sonst hat sich nichts verändert.

Von der Programmierung sollte es auch sehr sauber sein. Referenzen werden geschlossen, die Fehlercluster sind alle durchverbunden, hier tritt auch nichts auf.

Ich weiß leider nicht mehr, wo ich ansetzten soll.

Vielleicht hat ja noch jemand eine Idee!

Grüße, Vogster


Problem mit Speicherauslastung - jg - 10.09.2009 19:45

Deine Frage ist natürlich sehr allgemein, und ohne Kenntnis deines Sourcecode (Glas2) nur schwer zu beantworten.

1900 kB/min ist eine Menge!

Verwendest du irgendwas ActiveX-Artiges? Schließt du da aus Versehen irgendwelche Refnums nicht?

Analysiere auch mal mit dem Process Explorer von Sysinternals/Winzigweich:
http://www.wintotal.de/softw/index.php?id=533

Laufen da Handles hoch? Das ist immer ein sicheres Zeichen für nicht geschlossene Referenzen (FileHandles, ActiveX, etc. etc.).

---

In welcher LV-Version bearbeitest du dein Projekt? Schau vielleicht mal unter den Known Bugs bei NI, vielleicht ist da was mit SpeicherBug dabei, was du häufig aufrufst?!

Gruß, Jens


Problem mit Speicherauslastung - vogster - 10.09.2009 21:04

Hallo Jens,

als ich Deine Antwort so lesen, kommt mir die Idee, dass es irgendetwas mit meinem Meldern sein könnte.
Und siehe da, ich habe versehentlich die Funktionen "Melder anfordern" eine Schleife zu weit innen.
Dadurch wurden bei jedem Durchlauf (alle 20ms) 6 Melder neu angefordert. Zwar mit dem alten Namen,
aber das scheint LV nicht so zu mögen.

Nach der Bereinigung des Fehlers steigt der Speicher jetzt noch um 180kb/Minute, also Faktor 10 besser.
Da ist irgendwo noch ein kleiner Haken.

Morgen werde ich mal den Process Explorer einsetzten.

ActiveX ist zwar auch dabei, daran liegt es aber nicht. Die VIs laufen auch alleine einwandfrei.
Ich benutze seit zwei Wochen LV9, läuft soweit ganz gut.

Erstmal vielen Dank und gute Nacht!
Vogster (eigentlich auch Jens!)


Problem mit Speicherauslastung - IchSelbst - 10.09.2009 21:34

Zitat:Zwar mit dem alten Namen, aber das scheint LV nicht so zu mögen.
Dieses Verhalten ist richtig so!

Guckst du Hilfe zu "Melder anfordern":
Zitat:Wenn die Funktion "Melder anfordern" innerhalb einer Schleife eine Referenz auf einen benannten Melder ausgibt, erzeugt LabVIEW bei jeder Iteration der Schleife eine neue Referenz auf den Melder. Wenn "Melder anfordern" in einer engen Schleife (tight loop) verwendet wird, erhöht sich die Speicherauslastung kontinuierlich, da für jede neue Referenz weitere vier Bytes hinzukommen. Diese Bytes werden automatisch beim Stopp des VIs freigegeben. Bei Applikationen mit langen Ausführungszeiten scheint LabVIEW aber Speicher zu verlieren, da die Auslastung kontinuierlich steigt. Daher sollte nach jeder Iteration in der Schleife die Funktion Melder freigeben aufgerufen werden, damit nicht unnötig viel Speicher belegt wird.

Beachte:
Es wird eine Referenz auf einen Melder erstellt, nicht unbedingt ein neuer Melder. Jede Referenz verbraucht Speicher. Ich lass immer nur eine Referenz erstellen und verwende nur diese eine. Bei "Melder löschen" wird per Voreinstellung nur die Referenz gelöscht - der Melder wird erst gelöscht, wenn alle Referenzen gelöscht wurden.