LabVIEWForum.de
Optimierung laufendes Programm (Array auslesen...) - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: Signaldarstellung (/Forum-Signaldarstellung)
+---- Thema: Optimierung laufendes Programm (Array auslesen...) (/Thread-Optimierung-laufendes-Programm-Array-auslesen)

Seiten: 1 2


Optimierung laufendes Programm (Array auslesen...) - stoevinho - 23.08.2012 20:44

Hallo Forum-Gemeinde,

ich lese eine Trace-Datei aus (Mitschnitt von einem Gerät). In der Trace Datei sind verschiedene phy. Größen gespeichert. Insgesamt sind zu jeder phy. Größen ungefähr 80000-130000 Datensätze enthalten.
Das auslesen und darstellen der Datensätze funktioniert einwandfrei (dauert 0,5-1 Sek).

So jetzt - bei der ersten Operation auf dem Array - fängt das an zu stocken.
Eine einfache Aufgabe. Es existiert ein Array (1Dimensional, 1 phy. Größe) mit rund 127.000 Datensätzen. Es sollen bestimme Datensätze gefiltert werden. Ich habe das so gelöst, dass eine for-Schleife läuft und jeder passende Datensatz (Auswahlkriterium ist ein einfacher Vergleich mit einer numerischen Größe) wird in einem Shift-Register übergeben.

Diese Operation dauert gefühlte 5 Sekunden - zu lange...
Ich habe vor mehr als 10 solcher Operationen durchzuführen. In der Summe wird das Programm sehr langsam.

Könnt ihr mir weiterhelfen? Habe zwar Programmiererfahrungen, aber hier stoße ich an meine Grenzen.

Ich bin für jeden Tipp/Rat sehr dankbar!!!!

LabView 2010

PS: im false-Case ist eine Verdrahtung vom Shift-Register.. mehr nicht.

Siehe Bild (Anhang)

EDIT jg: hochgeladenes Bild mit Dateiendung *.vi gelöscht, Dateiendung korrigiert.



RE: Optimierung laufendes Programm (Array auslesen...) - Kasi - 23.08.2012 20:58

ganz schön gemein von dir, dein Bild *.vi zu taufen.
Ich zeig's hier mal zum "intuitiveren Aufruf", zum drüber-Gedanken-machen hab ich gerade keine Kapazität mehr frei Wink

---edit---
ok, für einen Gedanken reicht es noch:
"Auswahl Messreihe" ist schonmal fest in der For-Schleife, es wäre also sinnvoll, diese vor der For-Schleife aus dem 2D-Array als 1D-Array zu extrahieren und ausschließlich dieses dann analog zu durchforsten.


RE: Optimierung laufendes Programm (Array auslesen...) - jg - 23.08.2012 22:28

Offtopic2
(23.08.2012 20:58 )Kasi schrieb:  ganz schön gemein von dir, dein Bild *.vi zu taufen.
Ich zeig's hier mal zum "intuitiveren Aufruf", zum drüber-Gedanken-machen hab ich gerade keine Kapazität mehr frei Wink
Da kann ich Kasi nur zustimmen (@Kasi: Danke fürs Bild hochladen)! Was ist denn das für eine sinnfreie Idee, einem PNG-Bild (vom Prinzip her gut) die Dateiendung *.vi zu verpassen und dann hochzuladen? Hab das jetzt geändert.

--

Und jetzt On-Topic:
Punkt 1 hat Kasi schon gesagt, was soll das, aus einem 2D-Array innerhalb einer For-Loop immer dieselbe Zeile auszuschneiden. Noch schlimmer ist dabei die Verwendung lokaler Variabler. Bei JEDEM Auslesen wird dir eine Kopie im Speicher erzeugt, das kostet wahnsinnig Zeit bei großen Arrays. THINK Dataflow, der Draht ist in LabVIEW der Datenspeicher, nicht das Terminal oder noch schlimmer eine lokale Variable.

Weitere Optimierungsmöglichkeit: Auch Build-Array ist eine langsame Funktion, da bei jedem Aufruf der Speichermanager das bestehende Array vergrößern muss. Wenn du also sehr viele Build-Array Operationen durch deinen Vergleich hast, dann ist es besser, vor der Schleife ein Array mit "Initialize Array" zu initialisieren, dann innerhalb der Schleife nur mit Replace-Array-Subset zu arbeiten, und nach der Schleife das Array auf die wahre Größe zu verkleinern.

Gruß, Jens


RE: Optimierung laufendes Programm (Array auslesen...) - stoevinho - 25.08.2012 11:04

Hallooo! O)

Erstma vielen Dank für eure Antworten!! Eure Anregungen werde ich mir zu Gemüte führen; sollte ich da nicht weiterkommen weiß ich wo ich euch finde Big Grin
Dass mit dem Bild tut mir natürlich leid, .. hätte gedacht dass er das anzeigt vonwegen "Bild.vi.png" Angel_not

Ich mache mich ans Werk. Danke und bis später! ;-)


RE: Optimierung laufendes Programm (Array auslesen...) - Lucki - 25.08.2012 14:38

Kommentare:
1.
Zitat:Noch schlimmer ist dabei die Verwendung lokaler Variabler.
Das hat man zwar schon 1000 mal gelesen, und zwar in allen Foren, weniger bei NI selbst, entpricht aber weder meinen eigenen Erahrungen, noch dem, wie NI selbst in seinen eigenen Beispielen mit lokalen Variablen umgeht. Aber Du kanst ja die lokalen Variablen versuchshalber mal aus der Schleife rauslegen, damit sie nicht alle 125000 mal aufgerufewn werden müssen. Damit wird zwar noch eine Kopie mehr angelegt, aber das kostet kaum Zeit, eher Platz. Und berichte mal, ob das was bringt, interessiert mich auch.

Edit: Habe mir die VI nlch mal angesehen, Du hast es ja richtig gemachr. Die neuen Elemente im Array werden hinten angehängt. Mein Begründung, warum es sulange Dauert, ist hinfällig.

2.
Zitat:Weitere Optimierungsmöglichkeit: Auch Build-Array ist eine langsame Funktion, da bei jedem Aufruf der Speichermanager das bestehende Array vergrößern muss.
Klingt plausibel, aber LV scheint damit bei neueren Versionen keinerlei Probleme mehr zu haben.
Aber: Es ist ein geradezu gigantischer Zeitunterschied, ob bei Build Array ein neues Element am Anfang oder am Ende des Array hinzugfügt wird. Geschieht es am Anfang, dann werden bei jedem Hinzufügen alle alten Arrayelemente umgeschichtet, das kostet enorm Zeit - und genau hier liegt bei Dir der Hase im Pfeffer. Das Hinzufügen am Ende kostet kaum Zeit, wenn man mal davon absieht, dass vielleicht bei jedem 10000stem Element mal wieder etwas neuer Speicher herbeigeschafft werden muss.

Beispiel: in einem Array mit 125000 Zufallszahlen 0..1 werden diejemigen aussortiert, deren Wert größer als 0.5 ist.

Deine Methode: gefundene Werte werden am Index Null hinzugefügt
Dauer = 1600 ms
Gefundene Werte werden am Ende hinzugefügt, und anschließend wird der Array umgekehrt, damit die Ergebnisse identisch sind:
Dauer = 10 ms
[attachment=41276]
[attachment=41277]

Edit: Habe mir Dein VI noch mal angesehen. Du hast es ja richitig gemacht, die neuen Elemente werden am Array hinten angehängt, nicht im Index 0. Die Begründung, warum es bei Dir so lange dauert, ist somit hinfällig


RE: Optimierung laufendes Programm (Array auslesen...) - stoevinho - 29.08.2012 08:32

Ja, .. einen schönen guten Morgen! Wink

Also zunächst einmal hatte ich die lokalen Variablen nur reingenommen um das hier übersichtlich und klein zu halten. Das hatte ich als ersten Schritt rausgenommen, ... und voila - das Ding läuft perfomance-technisch super. Ich frag mich allerdings wieso? *grml*
Geht ratze-fatz! Eigentlich wäre hier jetzt Schluß mit dem Ontopic-Problem. Das Anhängen ist tatsächlich perfomance-technisch kein großer Aufwand für LabView. Lucki hat also Recht.

Also an dieser Stellen erst einmal viiiiiiiiiiiiiielen vielen vielen Dank!!! Big Grin

Eine Sache habe ich aber noch, weil ich einen Denkfehler habe oder die Logik der G-Sprache noch nicht verstanden habe: Ich wollte das mit dem "Array-erstelllen" für 120.000 Durchläufe ändern in "Teilarray ersetzen". Vorab ein Array initialisieren mit der Dimensions-Größe entsprechend der Durchläufe der Schleife. in der Schleife dann selber nur noch an entsprechender Stelle im Array rumfuschen. Ich würde mir gerne aber einen Counter erstellen wollen (so bin ich das gewohnt bei anderen Programmiersprachen), um dann hintereinanderweg die Daten ins Array zu schreiben.
Geht bei LabView ja nicht.. wie kann ich da Abhilfe schaffen. Im Prinzip will ich den funktionierenden Ausschnitt von oben nur ersetzen durch eine Logik mit "TeilArray ersetzen".

Vielen Dank vorab Blush

Grüße


RE: Optimierung laufendes Programm (Array auslesen...) - Kasi - 29.08.2012 11:11

(29.08.2012 08:32 )stoevinho schrieb:  Geht bei LabView ja nicht..

Wie, geht nicht? Geht im Grunde genau so, wie du es beschrieben hast Wink


RE: Optimierung laufendes Programm (Array auslesen...) - stoevinho - 29.08.2012 14:50

Also im Prinzip geht das schon, macht aber gar keinen Sinn - meine ich.

Angenommen ich möchte Werte aus einem Array filtern und neue/passende Einträge/werte in ein bereits vorinitialisiertes Array schreiben. Dann sind einige Stellen leer und das Array müsste erneut durchforstet werden und es kommt weiterer Aufwand hinzu.

Folgendes: Vorinitialisierung eines Arrays mit -1 Werten.
Passt ein Wert wird an gleicher Stelle (i-te Position) im vorinitialisierten Array der Wert überschrieben.
Das Array würde dann wie folgt aussehen: -1; -1; -1; 5; -1; -1; -1; 7.23; -1; -1; -1; 9.87; -1; -1;
So, jetz muss ich erneut schauen wo Werte drin sind die nicht "-1" entsprechen...
Im Prinzip ginge das mit einem "Counter" gut, der mitzählt wie viele Werte ich schon gefunden habe - so kenne ich das aus anderen Programmiersprachen - gibts aber in G (LabView) nicht Sad

Oder sehe ich das falsch mit dem vorherigen Bsp??


RE: Optimierung laufendes Programm (Array auslesen...) - GerdW - 29.08.2012 15:20

Hallo stoevinho,

Zitat:Im Prinzip ginge das mit einem "Counter" gut, der mitzählt wie viele Werte ich schon gefunden habe - so kenne ich das aus anderen Programmiersprachen - gibts aber in G (LabView) nicht
Warum sollte es keine Counter geben? Einfach ein Schieberegister nehmen und fertig ist:
[attachment=41339]


RE: Optimierung laufendes Programm (Array auslesen...) - Kasi - 29.08.2012 15:21

ja, da habe ich dich ein wenig falsch verstanden. Aber auch das geht mit LabVIEW, mir persönlich gefällt die von Dir ursprüngliche Variante des direkten Ans-Array-hängen aber rein optisch besser.
[attachment=41338]
Mit LabVIEW 2012 gibt es aber auch eine noch schönere "Conditional Processing Loops", die dieses Problem aufgreifen.

--edit-- jetzt war Gerd schneller UND besser - ich hab ne unsinnige doppelte If-Abfrage drin - nimm lieber Gerd's Beispiel Big Grin