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 

Schneller Umgang mit großen Arrays



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!

09.09.2011, 08:54 (Dieser Beitrag wurde zuletzt bearbeitet: 09.09.2011 08:55 von curassas.)
Beitrag #1

curassas Offline
LVF-Neueinsteiger


Beiträge: 7
Registriert seit: Jan 2011

8.6.1
2007
DE


Deutschland
Schneller Umgang mit großen Arrays
Hallo,
vielleicht hat ja jemand ein paar Tipps für mich.

Ich erhalte aus einem Dll-Aufruf ein Array von einem Bild (1280x1024).
Dieses Array läßt sich z.B. mit ArraytoIMAQ nahezu ohne Zeitverlust als IMAQ-Image darstellen.

Nun möchte ich jedoch mit dem Array arbeiten! Doch schon das schreiben in ein Array dauert ca. 20ms.
Kann man dies irgendwie beschleunigen, oder gibt es hier bessere Methoden.

Vielen Dank für eure Hilfe.


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
09.09.2011, 09:35
Beitrag #2

kaiman Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 146
Registriert seit: Dec 2008

7.1.1, 2011
2007
EN

28***
Deutschland
RE: Schneller Umgang mit großen Arrays
Moin,

zwei Sachen sind mir nicht ganz klar. Warum willst du ein so großes Bild als Array anzeigen lassen? Klar, dass das Zeit kostet. Du kannst das Array auch ohne dass du es anzeigen lässt verarbeiten. Anzeigen auf dem FP Kosten immer relativ viel Zeit, es lohnt sich also immer die Anzahl der Anzeigen im FP zu reduzieren.
Zweite Unklarheit: Warum verarbeitest du nicht einfach das IMAQ Image? Dann sparst du dir den ganzen Array Kram. Oder willst du so spezielle Operationen machen die nicht im Vision Paket enthalten sind?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
20.09.2011, 16:26
Beitrag #3

curassas Offline
LVF-Neueinsteiger


Beiträge: 7
Registriert seit: Jan 2011

8.6.1
2007
DE


Deutschland
RE: Schneller Umgang mit großen Arrays
Hallo kaiman,

leider komme ich erst jetzt dazu, dir zu Antworten.

Also:
Hauptsächlich benötige ich das Array für Berechnungen. Da ich nur die "kleine" Vision-Lizenz verwende, analysiere ich das Array selbst.
Ich möchte eigentlich mehrere Schleifen (oder Eventstrukturen) parallel laufen lassen.
1. Bild holen (so schnell wie möglich)
2. Bild vermessen (so schnell wie benötigt)
3. Bild darstellen (15-20 Durchläufe pro Minute)
Dies sollte mir die Möglichkeit geben, je nach Bedarf die Mess- oder Anzeigeroutine auch asynchron laufen zu lassen, um so z.B. die Messroutine zu beschleunigen.
Natürlich ist hier die maximale Grenze die Bild-holen-Schleife. Das Holen der Bilddaten und das Speichern als Variable sind hier die Zeitfaktoren. An dem Dll-Aufruf kann ich nichts ändern, aber vielleicht gibt es eine schnellere Möglichkeit das Bild-Array (bzw. die Bilddaten) der VI zur Verfügung zustellen, als es in eine Variable zu schreiben.
In der jetzigen Version benötige ich wie schon erwähnt ca. 20ms fürs schreiben in das Array, meine Bild-holen-Schleife ist dadurch fast nur noch halb so schnell. Die Bilddarstellung ist ausgeschaltet, es läuft nur noch der DLL-Aufruf (IDS-uEye-GetImage) und das Schreiben ins Array (Variable).


Noch ein Vermerk zur Vision-Lizenz
Mit der kleinen Vision-Lizenz habe ich neben der reinen Darstellung (+Maskentools) nur die Wandler "IMAQ-Bild zu Array" und "Array zu IMAQ-Bild". IMAQ zu Array ist übrigen genauso langsam, wie das Schreiben in ein Array (ist ja letztlich auch nichts anderes!)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
20.09.2011, 20:01
Beitrag #4

GerdW Offline
______________
LVF-Team

Beiträge: 17.430
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: Schneller Umgang mit großen Arrays
Hallo curassas,

um die 3 Teilbereiche zu entkoppeln, bieten sich Queues an. Beispiele dazu findest du im Examplefinder.
Dann benötigst du auch keinen Arrayindicator mehr, um auf die Daten zuzugreifen...

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
22.09.2011, 13:38
Beitrag #5

curassas Offline
LVF-Neueinsteiger


Beiträge: 7
Registriert seit: Jan 2011

8.6.1
2007
DE


Deutschland
RE: Schneller Umgang mit großen Arrays
Hallo GerdW,

Das mit den Queues werde ich mal probieren.
Doch das Entkoppeln der Routinen ist nicht mein Problem, denn letztlich schreibe/lese ich auch hier über eine Referenz in/aus einer Variablen.

Mein Problem ist das eigentliche Schreiben.
Ich kann mir nicht vorstellen, dass das Schreiben in eine Queue schneller ist als das Schreiben in ein Array.
Aber ein Versuch kann nicht schaden!

Ich werde wohl überlegen müssen, wie ich direkt auf den Speicher, wo die Kamera das Bild hinterlegt zugreifen kann!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
22.09.2011, 15:14
Beitrag #6

eb Offline
LVF-Lernwilliger
***


Beiträge: 292
Registriert seit: Mar 2008

2014
2008
EN

12xxx
Deutschland
RE: Schneller Umgang mit großen Arrays
Also vielleicht grundsätzlich zu großen Arrays hätte ich noch folgende Hinweise:
- wenn das Füllen mit Realdaten schneller gehen soll, dann allokiere vorher den benötigten Speicherplatz mit "Array initialisieren", zum beschreiben dann einfach bestehende (Leer-)Elemente ersetzen, oder gleich "Inplace-Struktur" ausprobieren, evtll. passt das ja auf deinen Anwendungsfall
- "Anhängen" oder ähnliche Funktionen vermeiden, da eine neue Kopie erzeugt wird, die wieder allokiert werden muss, das dauert
- zum Überprüfen wo überall eine Kopie gemacht wird, unter "Profile" (Profile) -> "Show Buffer Allocations" (Zeige Puffer Allokation?) aktivierenn und das BD untersuchen
- wenn mit dem Array Operationen durchgeführt werden müssen, auf jeden fall Neuallokationen vermeiden, wenns geht mit "Inplace"-Strukturen arbeiten.
- Zur Darstellung Array dezimieren (in diesem Fall, Auflösung verringern?)
- Sofern sinnvoll lieber größere Arrays "in einem Stück" verarbeiten als viele kleine "Chunks". Ist natürlich abhängig vom gewünschten Schleifentiming

Grüße
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
26.09.2011, 13:13
Beitrag #7

eb Offline
LVF-Lernwilliger
***


Beiträge: 292
Registriert seit: Mar 2008

2014
2008
EN

12xxx
Deutschland
RE: Schneller Umgang mit großen Arrays
Zitat:- Sofern sinnvoll lieber größere Arrays "in einem Stück" verarbeiten als viele kleine "Chunks". Ist natürlich abhängig vom gewünschten Schleifentiming
Zu meinem letzten Satz muss ich jedoch noch sagen: zeitl. ist es meist sinnvoller große Arrays zu verwenden, statt viele kleine. Allerdings ist der RAM-verbrauch so auch deutlich höher. Ist der RAM knapp, ist eine Aufteilung in Chunks sinnvoll.
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
  Änderung von großen Cluster (Type Def.) führt zu out of Memory exeption spacz 8 5.793 28.10.2019 09:01
Letzter Beitrag: spacz
  Frage zur Compilierung, ist .EXE schneller als Start vom Frontpanel? Hasenfuss 1 2.543 30.06.2015 14:51
Letzter Beitrag: jg
Information Der richtige Umgang mit (Langzeit)Messdaten NoWay 6 5.000 13.05.2015 13:57
Letzter Beitrag: mathez
  Auswahl eines Arrays anhand des Wertes eines zweiten Arrays treffen alan 2 4.251 19.02.2015 16:12
Letzter Beitrag: alan
  Gutes LV Design bei großen Programmen elhorst 31 18.562 18.09.2014 06:31
Letzter Beitrag: elhorst
Bug Arrays... immer wieder Arrays nurso 6 6.821 15.08.2014 10:39
Letzter Beitrag: Lucki

Gehe zu: