LabVIEWForum.de - Speicher läuft in Statemachine voll (großes Array...)

LabVIEWForum.de

Normale Version: Speicher läuft in Statemachine voll (großes Array...)
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,

ich hab aktuell das Problem, dass in einer Statemachine der Arbeitsspeicher vom Rechner voll läuft. Das schaue ich mir mit dem Win TaskManager an.
Ich hab mal ein kleines Beispiel angehangen. Da wird zunächst der Speicher mit einem immer größeren Array bewußt vollgepackt. Aber wenn ich auf löschen gehe habe ich eigentlich erwartet, nachdem ein leeres Array übergeben wurde, dass der Speicher wieder leer wird. Wird er aber nicht. Was mach ich denn da falsch, bzw. wie bekomme ich den Speicher effizient leerer?

Gruß
Peter

LV2011
[attachment=47457]
Hallo Peter,

erstmal habe ich die Statemachine aufgeräumt...

Dann zum Problem:
Der Taskmanager zeigt den Speicher an, den LabVIEW (als IDE) reserviert hat. Dies ist nicht der Speicher, den dein VI aktuell benötigt...
LabVIEW holt sich Speicher vom OS und verwaltet diesen selbst. Allzu viele Eingriffmöglichkeiten hat man da nicht außer evtl. frommen Wünschen...
Hallo Gerd,

danke für die Info. Dein Aufräumarbei (case Struktur entfernen) macht natürlich Sinn.
Das Beispile ist ja nur ein Minimalbeispiel. Normal läuft das Array erstellen auch im subvi und nach Weiterverarbeitung habe ich auch dieses "Speicher freigeben" vi angehängt. Hab aber wohl das "Wünschen" vergessen, denn da hat sich nix geändert. Aus dem größeren Projekt hab ich auch ne exe erstellt und da kann ich (im Taskmanager) schön zusehen, wie der RAM Verbrauch von 2 auf ca. 45% ansteigt und dann stürzt die exe ab. Meist ohne Fehlermeldung.
Also muss ich wohl stärker die Daumen drücken oder Schauen, ob ich das vielleicht ganz anders aufbauen kann.

Gruß
Peter
Hallo Peter,

statt auf den Speicherverbrauch zu schauen, solltest du eher das Erstellen von Arrays aus 1000×1000 Strings (variabler Länge!) überdenken...

- Das Erzeugen unlimitierter (großer) Arrays ist immer schlecht bzgl. Speicherhandling...
- Das Erzeugen großer Stringarrays ist noch schlechter, da hier eine wesentlich kompliziertere Speicherstruktur dahintersteht (im Vergleich mit fixen Datentypen wie DBL-Zahlen)...

Merke: Wann immer du BuildArray in deinen Programmen nutzt, musst du mit Speicherproblemen rechnen.
Und diese kann man nicht abfangen, entsprechende Wünsche werden von NI bisher nicht umgesetzt... Sad
Hello again,

erstmal Danke für die bisherigen Tipps.

Ich hätte da aber noch mal ne Frage. Ich hab mir mal die Hilfe von NI bzgl. "Konfigurieren von vi-Aufrufen" angeschaut:
http://zone.ni.com/reference/de-XX/help/...ringcalls/
Bisher hab ich mich da nie drum gekümmert und alle subs mit dem Main geladen.

Dei Hilfe sagt "Beim ersten Aufruf laden und halten [...] wird das SubVI erst bei Bedarf geladen und nach dem Abschluss der Operation aus dem Speicher entfernt." Das hört sich ja hilfreich an.
Und "Bei jedem Aufruf neu laden [...] wird nicht garantiert, dass das SubVI auch nach dem Aufruf im Speicher bleibt.

Also nach meinem Verständnis sollte doch eigentlich "bei jedem Aufruf neu laden" weniger Speicher brauchen, wenn die subs mit dem großen Array immer neu geladen werden. Und bei "laden und halten" wird es aus dem Speicher entfernt!?

Übersetzungsfehler oder Verständnisfehler?

Gruß
Peter

P.S.: @ GerdW: in der Praxis habe ich ein ca. 10000x2 String Array erstellt mit BuildArray
Vielleicht hilft das ?
Referenz-URLs