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 

Geschwindigkeitsproblem: großes array an trigger teilen und sortieren



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!

07.01.2011, 11:00
Beitrag #1

tinger Offline
LVF-Grünschnabel
*


Beiträge: 22
Registriert seit: May 2010

2009
2010
de


Deutschland
Geschwindigkeitsproblem: großes array an trigger teilen und sortieren
Hallo zusammen,

ich hoffe ich habe das richtige Forum für diese Frage erwischt.
Ich habe ein Performanceproblem und bräuchte dazu ein paar Tipps. Ich bin kein richtiger LabVIEW Neuling mehr, aber über "Optimales" Programmieren musste ich mir bis jetzt nicht so viele Gedanken machen....

Die Aufgabe:

ich habe ein array mit 6553600 Werten (16 bit numeric) die aus einer Queue ausgelesen werden (zuvor wurden sie mit einer A/D Karte aufgenommen und Bufferweise in die Queue gesteckt, aber ich denke das ist nebensächlich)
nun soll auf das Signal getriggert werden und danach "sortiert" um das neue array dann wieder in eine Queue zu stecken (zur Weiterverarbeitung).
Bisher habe ich das mit einer while-schleife und mit der "built array" Funktion gelöst. Also while-Schleife mit shift registern. Habe dazu ein Bild angehängt (aufs wesentliche beschränkt).
Nachdem ich jetzt das Problem habe, das mein Programm insgesamt zu langsam ist (Queue läuft irgendwann voll...) habe ich versucht mich schlau zu machen wo ich optimieren kann und bin zu dem Schluss gekommen, das hier vielleicht die richtige Stelle istSmile
Ich habe gelesen das die "built array" Funktion nicht optimal ist weil der Speicher bei jedem durchlauf neu zugeordnet werden muss. Deswegen habe ich versucht das ganze mit "replace array subset" zu lösen. Das erscheint mir jetzt aber noch weniger schnell zu sein (vielleicht hab ich das einfach schlecht gelöst... hab auch dazu ein Bild angehängt).

Habe ich das einfach ungeschickt gemacht, oder ist in dem Fall die "built array" funktion doch die bessere? Oder gibt es noch irgendeine andere Möglichkeit, auf die ich noch nicht gekommen bin? Bin für jeden Tipp dankbar!

nur Vollständigkeitshalber: Ich verwende LabVIEW 2009

Grüße,
Christian


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

schrotti Offline
LVF-Freak
****


Beiträge: 842
Registriert seit: Feb 2008

2009 - 2011
2006
kA

70180
Deutschland
Geschwindigkeitsproblem: großes array an trigger teilen und sortieren
Hallo tinger,

ich kann dir nicht ganz folgen, da der gepostete Code unvollständig ist. Du sagst, im Puffer liegen 6553600 Elemente, warum liest du einmal 1000 und einmal alles aus? Warum initialisiert du bei der Variante Array Subset zwei neue Arrays und nimmst nicht stattdessen das bereits vorhandene? Bitte poste den vollständigen Code.

Gruß Julius
Empfehlungen: expressionflow, LavaG , mooregoodideas, OpenG, JKI Blog
Tipp
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
07.01.2011, 14:01
Beitrag #3

tinger Offline
LVF-Grünschnabel
*


Beiträge: 22
Registriert seit: May 2010

2009
2010
de


Deutschland
Geschwindigkeitsproblem: großes array an trigger teilen und sortieren
Hallo schrotti,

Danke das du versuchst mir zu helfen!
die "1000" bzw. "-1" sind nur der timeout vom queue auslesen, ich bekomme also immer ein array mit den 6553600 Werten aus der queue.
Das mit den zwei arrays mache ich, weil ich glaube anders nicht an das selbe ergebnis wie beim "built array" zu kommen, aber vielleicht liegt da mein denkfehler...

Ich kann gerne den ganzen code posten, aber ich glaube das hilft nicht, weil es nur verwirrt (da unten ist die relativ komplizierte trigger suche).

Der linke Draht der nach unten führt bringt dazu das array nach unten, wo dann in die "trigger"-Variable geschrieben wird. Im Falle vom "built array" kommt dann von unten nur noch die Referenz auf die neue queue (die zur Weiterverarbeitung). Im falle des "reshape array" geht rechts der Draht mit dem array nach unten um genauso in die neue queue gesteckt zu werden (hab ich dummerweise nicht genauso angeordnet... hoffe das verwirrt nicht zusätzlich).

Also was mein Problem angeht passiert da unten eigentlich gar nichts mehrSmile

Wird einigermaßen klar was ich mit dem "built array" erreichen möchte (ich denke das ist die leichter lesbare code-Variante)? Genau das gleiche versuche ich danach mit dem "reshape array subset"...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
07.01.2011, 14:16
Beitrag #4

Martin Heller Offline
LVF-Stammgast
***


Beiträge: 250
Registriert seit: Feb 2010

2011 SP1
2008
EN

5232
Schweiz
Geschwindigkeitsproblem: großes array an trigger teilen und sortieren
Array sind immer einwenig tricky. Wenn mir etwas nicht klar ist wie es funktioniert, arbeite ich in einem seperaten .vi mit der Funktion weiter (z.B manipulieren oder füllen von Arrays) und füge diese erst später wieder ein.


lg
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
07.01.2011, 16:03
Beitrag #5

schrotti Offline
LVF-Freak
****


Beiträge: 842
Registriert seit: Feb 2008

2009 - 2011
2006
kA

70180
Deutschland
Geschwindigkeitsproblem: großes array an trigger teilen und sortieren
Mein Fehler. Das ist natürlich der Timeouteingang. Teil das vorhandene Array auf und füge die zwei Arrays dort wieder ein.

Gruß Julius
Empfehlungen: expressionflow, LavaG , mooregoodideas, OpenG, JKI Blog
Tipp
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
07.01.2011, 17:54
Beitrag #6

tinger Offline
LVF-Grünschnabel
*


Beiträge: 22
Registriert seit: May 2010

2009
2010
de


Deutschland
Geschwindigkeitsproblem: großes array an trigger teilen und sortieren
Jetzt kann ich dir nicht mehr ganz folgen. Wo soll ich die zwei arrays wieder einfügen?
Vielleicht nochmal zur Erklärung, was ich tun möchte:
gehen wir davon aus ich bekomme erst das array
aaaaa1bbb
, dann das array
ccccc1ddd
und dann
eeeee1fff, wobei a, b, c, d, e und f beliebige werte sind und 1 den wert markiert, an dem der trigger festgestellt wurde. Dann soll meine schleife daraus
1bbbccccc
1dddeeee
usw. machen

ich denke das "built array" macht das auch, oder?
die frage ist nur, geht das mit array reshape subset vielleicht besser (oder mit einer dritten möglichkeit)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
08.01.2011, 16:09
Beitrag #7

schrotti Offline
LVF-Freak
****


Beiträge: 842
Registriert seit: Feb 2008

2009 - 2011
2006
kA

70180
Deutschland
Geschwindigkeitsproblem: großes array an trigger teilen und sortieren
Ob das mit "Replace Array Subset" schneller geht musst du ausprobieren. Ich frage mich nur, warum du so viele Arrays anlegst. Du hast das Array A[]. Weiterhin bildest du mittels des Inhalts von A[] die Teilarrays B[] und C[]. Aus B[] und C[] baust du nun wieder irgendwelche Arrays, obwohl doch B[] und C[] zusammen exakt die Größe von A[] haben, du also bloß den Inhalt von A[] überschreiben musst. Hier mal ein Bild.

   

Gruß Julius
Empfehlungen: expressionflow, LavaG , mooregoodideas, OpenG, JKI Blog
Tipp
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
08.01.2011, 16:39
Beitrag #8

tinger Offline
LVF-Grünschnabel
*


Beiträge: 22
Registriert seit: May 2010

2009
2010
de


Deutschland
Geschwindigkeitsproblem: großes array an trigger teilen und sortieren
Ah, da haben wir uns noch nicht ganz verstanden. Im Prinzip hast du natürlich Recht, die beiden Teilarrays sind genau so groß wie das ursprungsarray, aber wenn ich sie so wie du vorschlägst zusammen setze, bekomme ich ein array mit dem triggerereignis am anfang und danach werten die eigentlich vor dem trigger signal aufgenommen wurden. Was ich aber machen will, ist die eingehenden arrays so zu "sortieren" oder "umzubauen", dass arrays herauskommen, die mit einem triggerevent beginnen und dann die werte bis zum nächsten triggerevent enthalten. Deswegen die shift register...
Ich fürchte das hab ich v.a. in meiner ersten Nachricht nicht so gut dargelegt, Entschuldigung!
Aber vielleicht macht auch das Beispiel mit den Buchstaben klar, was ich haben will. Nach dem triggerevent (1) sollen eben die werte "b" und dann die werte "c" kommen und nicht "b" und "a". Und dann komme ich mit dem "reshape array subset" glaube ich nicht um die vielen arrays rum... oder doch?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
09.01.2011, 23:38
Beitrag #9

unicorn Offline
LVF-Freak
****


Beiträge: 680
Registriert seit: Jul 2009

8.6.1, 2010 - 2012
1994
EN

10xxx
Deutschland
Geschwindigkeitsproblem: großes array an trigger teilen und sortieren
Ich denke, dass die Variante mit "Split 1D Array" nicht die schlechteste ist. Mit dem Menupunkt Tools > Profile > Show Buffer Allocations kannst Du Dir jedenfalls angucken wie oft ein Array angelegt wird.

Was mich irritiert ist die lokale Variable Trigger. Er gibt den Index an bei dem das Array geteilt wird. Den Wert berechnest Du doch aus dem gerade aus der Queue genommenen Array berechnen, oder? Diesen Wert solltest Du per Draht und nicht über die Variable anschließen. Kurzum die lokale Varible ist nicht notwendig.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
09.01.2011, 23:55
Beitrag #10

tinger Offline
LVF-Grünschnabel
*


Beiträge: 22
Registriert seit: May 2010

2009
2010
de


Deutschland
Geschwindigkeitsproblem: großes array an trigger teilen und sortieren
Variablen sind aber nicht so schlecht für die Performance, oder?
Ich verwende sie, weil ich davon ausgehe das sich die Trigger Position nicht so schnell/drastisch verändert sondern langsam driftet... ich suche den Trigger also nicht in jedem Buffer (auch wegen der Geschwindigkeit, hoffe die Variable macht das nicht kaputtWink)

Mit der Methode "split 1D array" meinst du das zusammensetzen mit dem "built array", oder?
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
  1D-Array sortieren Fuchs 6 4.127 09.03.2021 16:27
Letzter Beitrag: Fuchs
  Spektren mit For-Schleife sortieren und in Array schreiben Daniel100 2 3.970 03.09.2016 08:25
Letzter Beitrag: Lucki
  Messdaten in 3D Array speichern und sortieren andrepf 8 7.608 08.04.2016 10:12
Letzter Beitrag: jg
  Array Sortieren aw 4 4.311 10.03.2015 14:22
Letzter Beitrag: aw
  2D Array sortieren machfax 12 12.692 06.02.2014 19:33
Letzter Beitrag: Trinitatis
  2D-Array nach einer Spalte sortieren wolfmichael 4 11.313 06.02.2014 15:50
Letzter Beitrag: Trinitatis

Gehe zu: