26.11.2009, 23:04
Beitrag #1
|
soranito
LVF-Neueinsteiger
Beiträge: 4
Registriert seit: Dec 2008
10.0
2005
DE
89073
Deutschland
|
SubVi performance bei großen Datenstrukturen
Hallo zusammen,
in meiner Problemstellung habe ich mit großen arrays zu tun, möchte den Code aber einigermaßen sinnvoll strukturieren, sprich: SubVis verwenden. Damit LabVIEW nicht jeweils beim Betreten und Verlassen des SubVis eine Kopie der Daten erstellt, dadurch bei jedem Aufruf mehrere MB kopiert und so die Performance bzw. den verfügbaren Arbeitsspeicher "tötet", verwende ich den Ausführungsmodus Unterprogramm (Eigenschaften für Vi->Ausführung->Priorität->Unterprogramm).
Mein Problem ist nun, dass bei diesem Ausführungsmodus kein Debugging verfügbar ist und asynchrone Knoten verboten sind (z.B. Queues, teilweise Events). Gibt es eine andere Möglichkeit, effizient Arrays mittels SubVis zu verarbeiten und dennoch asynchrone Knoten verwenden zu können?
In LabVIEW 9 dürfte dieses Problem mit Datenreferenzen lösbar sein, leider arbeiten wir noch mit LV 8.6.
Schöne Grüße,
soranito
|
|
|
26.11.2009, 23:31
Beitrag #2
|
Y-P
☻ᴥᴥᴥ☻ᴥᴥᴥ☻
Beiträge: 12.612
Registriert seit: Feb 2006
Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN
71083
Deutschland
|
SubVi performance bei großen Datenstrukturen
Was für Events sollen nicht funktionieren? Und wieso kannst Du keine Queue in einer Subroutine (Englischer Begriff Deiner Ausführungsart) erstellen? Ich habe versucht eine Queue zu erstellen und das hat funktioniert.
Ansonsten sind Subroutines gar keine so schlechte Sache, zwar nicht so schnell, wie Primitives, aber wesentlich schneller, als ein normales SubVI (je nachdem, was damit gemacht werden soll). Auf dem Performance-Guide gab's einen netten Benchmark mit Subroutines und einem normalen SubVI.
Kannst Du mal Dein Bsp. hochladen und sagen, um was für Größenordnungen es bei Deinem Array geht?
Gruß Markus
PS: Bitte . Da steht noch LabVIEW 8.2 drin und Du hast ja jetzt anscheinend schon LabVIEW 8.6.
--------------------------------------------------------------------------
Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
|
|
|
27.11.2009, 02:49
Beitrag #3
|
soranito
LVF-Neueinsteiger
Beiträge: 4
Registriert seit: Dec 2008
10.0
2005
DE
89073
Deutschland
|
SubVi performance bei großen Datenstrukturen
Hallo Markus.
Du hast recht: Queue erstellen funktioniert, aber in Queue schreiben und Queue lesen funktionieren nicht. Bei Ereignissen war ich auch etwas ungenau: Es funktionieren "Benutzerereignis erzeugen", "Benutzerereignis erstellen", aber Ereignisstrukturen sind verboten. Ein weiteres Problem ist, dass in einem Unterprogramm nur VIs verwendet werden dürfen, die ebenfalls den Typ Unterprogramm haben. Schließlich kommt noch dazu, dass in Unterprogrammen der Debugger nicht funktioniert.
Im Augenblick geht es mir nicht direkt um die Lösung einer konkreten Problemstellung, sondern eher um die generelle Möglichkeit, Code mit Hilfe von SubVIs zu strukturieren wobei ich einerseits Performanceeinbrüche bei großen Datenmengen vermeiden möchte und andererseits alle Möglichkeiten zur Verfügung haben, die ich hätte, wenn ich komplett auf SubVis verzichte.
Das mit dem konkreten Beispiel könnte auch etwas kompliziert werden, da das array in einem ziemlich umfangreichen Projekt die Rolle des zentralen Puffers übernimmt. Ich habe den Post vor allem deshalb erstellt, da es mir schon öfters passiert ist, dass ich sehr große Datenstrukturen habe (z.B. Filme), in denen z.B. nur ein Frame manipuliert werden soll, das aber oft hintereinander und jedesmal wird der komplette Puffer kopiert. In jeder anderen ernsthaften Programmiersprache gibt es neben dem in LabVIEW typischen Call-By-Value (also kopieren der Daten) Call-By-Reference (lediglich übergabe eines Zeigers) - ich dachte mir einfach, diese Möglichkeit MUSS es bei einer über 20 Jahre alten Programmiersprache auch geben.
Du hattest primitives erwähnt. Sehe ich das richtig, dass damit eingebaute Funktionen wie z.B. "Teil-Array ersetzen" bezeichnet werden? Gibt es etwa eine Möglichkeit, solche primitves auch selbst zu erstellen?
Schöne Grüße,
Matthias
P.S.: Danke für den Hinweis (8.2->8.6)
|
|
|
27.11.2009, 09:46
Beitrag #4
|
IchSelbst
LVF-Guru
Beiträge: 3.695
Registriert seit: Feb 2005
11, 14, 15, 17, 18
-
DE
97437
Deutschland
|
SubVi performance bei großen Datenstrukturen
' schrieb:In jeder anderen ernsthaften Programmiersprache gibt es neben dem in LabVIEW typischen Call-By-Value (also kopieren der Daten) Call-By-Reference (lediglich übergabe eines Zeigers) - ich dachte mir einfach, diese Möglichkeit MUSS es bei einer über 20 Jahre alten Programmiersprache auch geben.
Die Frage ist, ob es Intension von LabVIEW ist, auch Call-By-Reference auf oberster Ebene zuzulassen. Streng genommen widerspricht das nämlich dem Datenflußprinzip (RaceConditions!).
Du hast aber jederzeit die Möglichkeit einer eigenen (c++ etc.) DLL, um z.B. performance-sensible Berechnungen zu machen.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
|
|
|
27.11.2009, 09:48
Beitrag #5
|
|
|
27.11.2009, 11:53
Beitrag #6
|
soranito
LVF-Neueinsteiger
Beiträge: 4
Registriert seit: Dec 2008
10.0
2005
DE
89073
Deutschland
|
SubVi performance bei großen Datenstrukturen
' schrieb:Wenn das das ist was du willst und ich meine: Wie kommt du darauf, dass das in LV9 geht?
Kann das einer bestätigen? Dass da ein Unterschied ist zwischen 90 und 86? Ich selbst hab's jetzt noch nicht probiert.
Ich habe es auf http://www.ni.com/LabVIEW/whatsnew/d/features.htm gelesen: "Seit LabVIEW 7.1"->Datenreferenzen. Unter dem dort angegebenen Link (der bei mir heute leider einen Server-Error gibt), war noch vor kurzem ein Tutorial erreichbar, in dem die Verwendung von Datenrefenzen unter LV9 genauer beschrieben wurde.
|
|
|
27.11.2009, 12:05
Beitrag #7
|
|
|
| |