LabVIEWForum.de - Speicher-Allokation vs. Konstante

LabVIEWForum.de

Normale Version: Speicher-Allokation vs. Konstante
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen,

ich möchte von 4 verschiedenen Kameras Bilddaten einsammeln. Dadurch entstehen irgendwann 2D-U32-Arrays mit 1024*3000 Werten.
Hierbei möchte ich mit dem Speicher so effizient wie möglich umgehen. Also nehme ich mir ein "leeres" 2D-Array und beschreibe diese zeilenweise während der Daten-Akquise.

Meine Frage ist nun, ob es ratsam ist, das "Leer-Array" beim Aufruf des jeweiligen VIs jedesmal zu initialisieren und somit jedes Mal eine Speicheranforderung zu stellen, oder ob es effizienter sein könnte, dieses "Leer-Array" als Konstane ins VI zu legen, in der Erwartung, dass der nötige Speicher beim Laden der EXE einmal allokiert wird.


Gruß, Marko
Hallo Marko,

Zitat:Meine Frage ist nun, ob es ratsam ist, das "Leer-Array" beim Aufruf des jeweiligen VIs jedesmal zu initialisieren und somit jedes Mal eine Speicheranforderung zu stellen, oder ob es effizienter sein könnte, dieses "Leer-Array" als Konstane ins VI zu legen, in der Erwartung, dass der nötige Speicher beim Laden der EXE einmal allokiert wird.
Grundregel in LabVIEW: solange ein VI im Speicher bleibt (wie z.B. ein subVI), solange bleiben auch seine Speicheranforderungen aktiv!

Wenn du also einmalig mit InitArray einen Speicherbereich abfragst, dann wird der Memorymanager diesen Speicherbereich auch beim erneuten VI-Aufruf weiterverwenden (solange es aufgrund des nicht einsehbaren internen Speichermanagements von LabVIEW möglich ist)…

Zitat:Also nehme ich mir ein "leeres" 2D-Array und beschreibe diese zeilenweise während der Daten-Akquise.
Wieso erstellst du ein leeres Array?
Warum erstellst du nicht gleich ein Array in der erforderlichen Größe und ersetzt dessen Elemente durch deine Daten?
(19.12.2016 12:51 )GerdW schrieb: [ -> ]Wieso erstellst du ein leeres Array?
Warum erstellst du nicht gleich ein Array in der erforderlichen Größe und ersetzt dessen Elemente durch deine Daten?

Hallo Gerd,

Danke für deine Ausführungen.
Mit dem "leeren" Array meinte ich natürlich ein Array in der erforderlichen Größe, deren Zeilen ich dann überschreibe - deshalb die Anführungszeichen.

Die Frage war für mich nur, ob ich dieses vorinitialisierte Array mit Initialize Array erzeuge, oder ob es performanter wäre, eine Konstante ins BD zu legen.
Aber wenn die Speicheranforderung nur einmal beim 1. VI-Aufruf erfolgt, dann kann ich es wohl damit machen und bin flexibler, was die Arraygröße angeht.


Gruß, Marko
Hallo Marko,

Zitat:ie Frage war für mich nur, ob ich dieses vorinitialisierte Array mit Initialize Array erzeuge, oder ob es performanter wäre, eine Konstante ins BD zu legen.
Der LabVIEW-Compiler ist relaitv intelligent, wenn es um "constant folding" geht: "konstante" Strukturen werden beim Kompilieren schon "ausgerechnet" und im Executable durch Konstanten ersetzt. (Einfach mal dazu lesen.)
Wenn du also ein InitArray mit Konstanten an den Eingängen aufrufst, wird der Compiler daraus (wahrscheinlich) eine Arraykonstante machen…
Referenz-URLs