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 

Optimierung laufendes Programm (Array auslesen...)



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!

23.08.2012, 20:44 (Dieser Beitrag wurde zuletzt bearbeitet: 23.08.2012 22:16 von jg.)
Beitrag #1

stoevinho Offline
LVF-Grünschnabel
*


Beiträge: 17
Registriert seit: Aug 2012

2010
2012
DE



Optimierung laufendes Programm (Array auslesen...)
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.


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
23.08.2012, 20:58 (Dieser Beitrag wurde zuletzt bearbeitet: 23.08.2012 21:08 von Kasi.)
Beitrag #2

Kasi Offline
LVF-Stammgast
***


Beiträge: 342
Registriert seit: Dec 2010

6 - 2009
2005
DE_EN

79194
Deutschland
RE: Optimierung laufendes Programm (Array auslesen...)
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.


Angehängte Datei(en) Thumbnail(s)
   

If you're havin' serial communication problems I feel bad for you, son, I got 99 problems but a baud ain't one! (except if using USB2serial converters, then I experience serialous problems)
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
23.08.2012, 22:28 (Dieser Beitrag wurde zuletzt bearbeitet: 23.08.2012 22:29 von jg.)
Beitrag #3

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
RE: Optimierung laufendes Programm (Array auslesen...)
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

Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)

!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
25.08.2012, 11:04
Beitrag #4

stoevinho Offline
LVF-Grünschnabel
*


Beiträge: 17
Registriert seit: Aug 2012

2010
2012
DE



RE: Optimierung laufendes Programm (Array auslesen...)
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! ;-)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
25.08.2012, 14:38 (Dieser Beitrag wurde zuletzt bearbeitet: 26.08.2012 10:45 von Lucki.)
Beitrag #5

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
RE: Optimierung laufendes Programm (Array auslesen...)
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
   

11.0 .vi  Ement an Array.vi (Größe: 13,51 KB / Downloads: 168)


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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
29.08.2012, 08:32 (Dieser Beitrag wurde zuletzt bearbeitet: 29.08.2012 08:33 von stoevinho.)
Beitrag #6

stoevinho Offline
LVF-Grünschnabel
*


Beiträge: 17
Registriert seit: Aug 2012

2010
2012
DE



RE: Optimierung laufendes Programm (Array auslesen...)
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
29.08.2012, 11:11
Beitrag #7

Kasi Offline
LVF-Stammgast
***


Beiträge: 342
Registriert seit: Dec 2010

6 - 2009
2005
DE_EN

79194
Deutschland
RE: Optimierung laufendes Programm (Array auslesen...)
(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


Angehängte Datei(en) Thumbnail(s)
   

If you're havin' serial communication problems I feel bad for you, son, I got 99 problems but a baud ain't one! (except if using USB2serial converters, then I experience serialous problems)
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
29.08.2012, 14:50
Beitrag #8

stoevinho Offline
LVF-Grünschnabel
*


Beiträge: 17
Registriert seit: Aug 2012

2010
2012
DE



RE: Optimierung laufendes Programm (Array auslesen...)
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??
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
29.08.2012, 15:20 (Dieser Beitrag wurde zuletzt bearbeitet: 29.08.2012 15:21 von GerdW.)
Beitrag #9

GerdW Offline
______________
LVF-Team

Beiträge: 17.427
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: Optimierung laufendes Programm (Array auslesen...)
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:
   

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
29.08.2012, 15:21 (Dieser Beitrag wurde zuletzt bearbeitet: 29.08.2012 15:24 von Kasi.)
Beitrag #10

Kasi Offline
LVF-Stammgast
***


Beiträge: 342
Registriert seit: Dec 2010

6 - 2009
2005
DE_EN

79194
Deutschland
RE: Optimierung laufendes Programm (Array auslesen...)
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.
   
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

If you're havin' serial communication problems I feel bad for you, son, I got 99 problems but a baud ain't one! (except if using USB2serial converters, then I experience serialous problems)
Webseite des Benutzers besuchen 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
  Daten auslesen und in Array schreiben Daniel90 3 5.655 29.12.2015 18:01
Letzter Beitrag: Daniel90
  2D Array zeitlich auslesen. Bexx 8 5.658 15.06.2011 10:14
Letzter Beitrag: Bexx
  Aus einem Array jeden 2. Wert auslesen TimoRT 6 7.367 08.10.2007 16:24
Letzter Beitrag: Lucki
  Optimierung / curve-fitting anton.lindner 5 8.571 20.02.2005 16:53
Letzter Beitrag: anton.lindner

Gehe zu: