LabVIEWForum.de - Fehlermeldung "Speicher voll"

LabVIEWForum.de

Normale Version: Fehlermeldung "Speicher voll"
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,

ich habe ein Programm, mit dem Messwerte gelesen, editiert und weggeschrieben werden sollen. Doch jetzt kann ich das Programm nicht mehr vollständig ausführen, weil LV jedes mal abbricht mit der Meldung

Nicht genügend Speicher zum Abschließen dieser Operation

Fehler 2 ist bei Eigenschaftsknoten (arg 1) in gesamt1207.vi aufgetreten

Mögliche Ursachen:

LabVIEW: Speicher ist voll.
=========================
NI-488: Keine Listener für GPIB gefunden.

Während ich das Programm ausführe geht die CPU Auslastung teilweise auf 100%. Kann das daran liegen? Hat jemand eine Ahnung wie ich das Problem beheben kann? Die Meldung treibt mich noch in den Wahnsinn...

Im Anhang das VI. Lv86_img

Vielen Dank schon mal für eure Hilfe.
' schrieb:Die Meldung treibt mich noch in den Wahnsinn...
Dein Programm treibt mich in den Wahnsinn Cool
Ich hab leider nur zwei 17'' Monitore, dh ich kann dein Programm nicht gescheit sehen.
Versuche dennoch dir zu helfen:
Wo initialisierst du deine Hardware? Hast du tatsächlich 10 Kanäle und möchtest davon die Daten oder hast du einen Kanal von dem du gerne die ersten 10 Samples hättest? Jenachdem lässt sich in der oberen Schleife etwas optimieren.
Auch würde ich in der oberen Schleife dann auch mal den xy-Graphen rausnehmen. Ein update des GUIs jede Itteration braucht viel zu viel Resource. Ich würde niemals die Datenaufzeichnung und deren Darstellung in einem Task/Process/Schleife ablaufen lassen. Des weiteren wird deine obere Schleife im 2ms Takt ausgeführt. Ist das wirklich notwendig?
Ich denke du solltest erst mal noch hier spezifizieren was du wie aufnehmen möchtest (zB 10 Kanäle mit 20kSamples/sec pro Kanal)
Erst dann lässt sich dein Code mehr oder minder verstehen....

Gruess,
Christian
Hallo bavariia,

du lernst es eben auf die harte Tour:
LabVIEW verwaltet deine Daten nicht in Variablen, sondern in den Drähten! Und lokale "Variablen" (wie auch "value"-PropertyNodes) erzeugen jedesmal eine zusätzliche (!) Datenkopie.

Du sammelst deine Daten für den Graph, indem du wiederholt PropertyNodes liest und schreibst. Abgesehen, dass das langsam ist - du müllst dir auch deinen Speicher voll. Verwende stattdessen ein Shiftregister. Außerdem solltest du die Datenmenge reduzieren. Dein Graph hat nur ~400 Pixel Breite: wie sinnvoll ist da die Darstellung von tausenden Punkten?

@Christian:
Stell dir dieses VI auf 1280×800 Pixeln vorSad
Die Stelle hier frisst auch Speicher:
[attachment=27781]

Autoindexing eines 3D-Array, ohne dass es weiterverendet wird.Hmm

Gruß, Jens
Hallo,

erstmal vielen Dank für die schnellen Antworten!!! Wie gesagt ich bin totaler LV- Anfänger.... Ressourcensparend Programmieren ist wohl noch nicht mein Ding. Ich werd jetzt mal versuchen eure Verbesserungsvorschläge einzubauen, vielleicht gehts ja dann. Wie könnte ich das VI denn "kleiner" machen? Also mit SubVIs... Aber braucht das dann nicht noch mehr Speicher, wenn diese ständig aufgerufen werden müssen?

@oenk: Ich brauche 10 Kanäle, weil ich 10 Kraftsensoren habe. Die Sensoren, die die Kraft in die selbe Richtung messen, werden miteinander addiert und nein, ich kann das nicht Hardwaretechnisch so umbauen, dass ich gleich nur einen Sensor für eine Richtung habe. Meine Task Konfiguration: kontinuierlicher Erfassungsmodus mit einem Sample und 200 Hz. Wenn ich den Graph aus de rSchleife rausnehme, bekomme ich ja erst am Ende der Messung das gesamte Bild, ich brauche aber tatschlich den Verlauf des Signals immer aktuell...
@Gerd: wie mache ich das mit einem Shift register?

Grüße
bavariia
' schrieb:Also mit SubVIs... Aber braucht das dann nicht noch mehr Speicher, wenn diese ständig aufgerufen werden müssen?
Wenn du das Datenfluss prinzip nicht verletzt (also die Daten von deinem HauptVi ins SubVis mit Input und Output connectors versehst und innerhalb des SubVis die Daten nicht an lokale Variablen und/oder Property Nodes übergibst) hast du keinen Speicherverlust. Der LabVIEW Compiler optimiert dir das dann schon...Du kannst dir das ganze auch in eine Statemachine packen, dann wird es auch übersichtlicher (-> LabVIEW -> New -> VI -> From Template -> Design Patterns -> Standard State Machine)

' schrieb:Meine Task Konfiguration: kontinuierlicher Erfassungsmodus mit einem Sample und 200 Hz.
Wirklich nur ein Sample pro Aufruf alle 1/200Hz? Macht es da nicht mehr Sinn 200 Samples auf einmal Aufzuzeichnen und dann alle Sekunde das GUI upzudaten? Und wo wird die HW initialisiert? Du hast nirgends auf dem Blockdiagramm ein DaqMx Create Channel und Config Channel (der tatsächliche Namen des Vis kann abweichen...)

' schrieb:Wenn ich den Graph aus de rSchleife rausnehme, bekomme ich ja erst am Ende der Messung das gesamte Bild, ich brauche aber tatschlich den Verlauf des Signals immer aktuell...
OK, dann schau dir mal das Consumer/Producer Pattern an (-> LabVIEW -> New -> VI -> From Template -> Design Patterns -> Producer/Consumer Design Pattern (Data)). Dort wird dir gezeigt, wie du Code parallel abarbeiten lassen kannst mit verschiedener Priorisierung der Tasks...

viel Erfolg,
Christian
Hallo bavariia,

ergänzend zu oenks Hinweisen:
Wenn ich mich nicht arg täusche, hast du da einen erheblichen Speicherbedarf aufgrund deiner ArrayBuild-Benutzung (s. Attachment).

Um den Speicherbedarf zu reduzieren, ist es auch immer sinnvoll, vernünftige Datentypen einzusetzen. Du hattest diverse coercion dots in deinem VI - die brauchen jeweils Speicher zum umwandeln zwischen Datentypen!

Lv86_img
Referenz-URLs