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!
Vielen Dank für Eure Beiträge zu meiner Frage, wie ich ein einzelnes Array in seiner Größe begrenzen kann. Dank Euch habe ich neue Möglichkeiten kennengelernt, wie man das machen kann. Die Variante mit der Queue hat mir gefallen, weil ich nicht wusste, dass ich alle in der Queue enthaltenen Elemente als Array auslesen kann. Das mit der Queue hat allerdings den Nachteil, dass ich stets nur 1 Element anfügen kann. Besteht mein "Datenstrom" aus einem Array mit mehreren Elementen, so müsste ich dies z.B. durch eine indizierte for-Schleife auftrennen, um jedes Element einzeln in die Queue zu senden.
Aus den Beiträgen habe ich gelernt, dass man bei großen Arrays auf die Speichereffizenz achten sollte. Dazu kann es vorteilhaft sein, ein Array zu indizieren und auf Build-Funktionen zu verzichten und ReplaceArraySubset-Variante zu nehmen.
Leider reicht meine Erfahrung noch nicht aus, um diese Erkenntnisse bestmöglich zu berücksichtigen, darum möchte ich meinen Ansatz hier vorstellen und ich würde mich über Rückmeldungen freuen, an welchen Stellen noch andere Lösungsmöglichkeiten bestehen.
Zunächst erzeuge ich ein Testsignal aus drei Sinus-Kurven mit unterschiedlichen Amplituden und Offsets. Dieses Signal wird in einen 1D-Array-Strang umgewandelt, weil ich in dieser Form später meine Mess-Signale von der Hardware bekomme.
Es wird ein Array initialisiert mit AnzKanäle = 3 und MaxAnzahl=2500.
Der 1D-Array-Strang wird in ein 2D-Array umgewandelt, dass zur Form des initialisierten Arrays passt.
Der umgewandelte Datenstrang wird an das init. Array drangehängt und der vordere Teil entsprechend abgesägt, so dass nur MaxAnzahl Elemente vorhanden sind.
Diese Methode funktioniert, ich bin mir aber nicht sicher, ob diese Form im Sinne der Speicherauslastung optimal ist, da ich durch Dranhängen und Zurechtsägen Build-Funktionen verwende. Natürlich habe ich versucht, mit der Funktion "Teil ersetzen" zu arbeiten und in dem angehängten Bild ist zu sehen, dass diese Funktion nicht funktioniert.
Dann wird auch in Euren Lösungsvorschlängen in dem Thread zu 1D-Arrays die Funktion Array rotieren verwendet. Diese Funktion arbeitet aber mit 1D-Arrays.
Ein anderer Lösungsansatz wäre nun, die 2D-Arrays in einer indizierten Schleife in 1D-Arrays umzuwandeln, um dort mit den 1D-Arrays zu arbeiten. Ist diese Lösung meinem ersten Ansatz vorzuziehen, um der Maßnahme gerecht zu werden, Build-Funktionen zu vermeiden?
22.08.2013, 23:32 (Dieser Beitrag wurde zuletzt bearbeitet: 22.08.2013 23:37 von Hasenfuss.)
Ich habe hier nochmal das Testprogramm etwas erweitert. In dieser Version sind es nicht 3 Kanäle und Testsignale, sondern 20 Kanäle. Und Maxanzahl hat den Wert 100.000. Ich habe unterschiedliche Pausen in der while-Schleife ausprobiert. Die Prozessorauslastung ging bei 50ms bis zu 50 Prozent hoch. Ein Szenario mit 500ms Wartezeit und einer MaxLänge von 30.000 Datensätzen (*20 Kanäle) entsprechen dabei annähernd realistischen Werten.
Muss ich also den dort verwendeten Ansatz aus Performancegründen umbauen? Leider übersteigt diese Frage mein bisheriges Wissen und falls ihr mir weitere Optimierungstipps geben könntet, würde ich mich sehr freuen.
Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN
71083
Deutschland
RE: mehrdimensionales Array verarbeiten
Was machst Du mit den Sinüssen (?)? Da macht doch jeder dasselbe, oder sehe ich das falsch? Dann reicht das auch nur einmal.
Gruß Markus
-------------------------------------------------------------------------- Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
Habe mirs kurz anesehen, das BD ist ja riesig. Auf alle Fälle müßte Dein Wissen nach 224 Beirägen ausreichend sein, um solche unzumutbaren Strickmuster zu vermeiden und die ersten 17 Waveforms so zu erzeugen:
23.08.2013, 07:50 (Dieser Beitrag wurde zuletzt bearbeitet: 23.08.2013 07:53 von GerdW.)
Zitat:Die Prozessorauslastung ging bei 50ms bis zu 50 Prozent hoch.
Kein Wunder, wenn du Arrays mit jeweils 2Mio DBL-Werten (also jeweils 16MB-Blöcke) in diverse Anzeigen schiebst und noch dazu einen Mischsignal-Graph benutzt...
Nimm die ganzen Anzeigeelemente aus der Schleife heraus und die Rechenlast geht auf ca. ¼ zurück (bei mir von 18% auf 4%)!
Außerdem solltest du die Signalgenerierung aus der Schleife herausnehmen, wenn du hier etwas halbwegs korrekt simulieren willst.
Zum eigentlichen Problem:
Durch die Benutzung von InsertIntoArray und ArraySubset muss fortlaufend der MemoryManager eingreifen. Dies geht zu Lasten der Performance. Vielleicht solltest du mit ReplaceArraySubset arbeiten?
Herzlichen Dank für Eure Antworten. Man kann die Testsignalerzeugung sicherlich auf elegantere Weise erzeugen als ich in dem Beispiel dies schnell mit Copy-Paste gemacht habe und das VI auf diese Weise so verunstaltet habe, ich werde mich bemühen, so etwas nicht mehr zu tun.
Meine eigentliche Frage betraf aber den zweiten Teil des Programms, in welchem das Array für den Mischsignalgraph aufbereitet wird.
Zitat von GerdW:
"Durch die Benutzung von InsertIntoArray und ArraySubset muss fortlaufend der MemoryManager eingreifen. Dies geht zu Lasten der Performance. Vielleicht solltest du mit ReplaceArraySubset arbeiten? "
Schaut doch mal im ersten Beitrag von mir das zweite kurze Bild ohne das lange Frontpanel an. Dort habe ich versucht, die Ersetzen-Funktion zu benutzen, leider passen die Datentypen nicht zueinander. Und selbst wenn ich jetzt den neuen Teil vorne oder hinten anfüge, so muss ich auch noch rotieren, eine Rotation geht aber nur eindimensional, sofern ich die Funktion dazu benutze.
Ich bekomme es nicht hin, mit ReplaceArraySubset-Funktion zu arbeiten bzw. den Strang an neuen Elementen so umzuformen, dass er in das indizierte Array hineinpasst.
Zitat: Dort habe ich versucht, die Ersetzen-Funktion zu benutzen, leider passen die Datentypen nicht zueinander.
ReplaceArray kann man so benutzen:
Wenn du ein 2D-Teilarray ersetzen willst, musst du beide Indizes angeben! Hätte man mit etwas rumprobieren schnell rausfinden können...
Zitat:Und selbst wenn ich jetzt den neuen Teil vorne oder hinten anfüge, so muss ich auch noch rotieren, eine Rotation geht aber nur eindimensional, sofern ich die Funktion dazu benutze.
Wie wäre es denn, wenn du deinen Buffer intern als 1D-Array ausführst? Dann kannst du bequem RotateArray nutzen und einfach die neuen Daten per ReplaceArray in den Buffer eintragen. Nur für die nachfolgende Auswertung stellst du dann auf 2D-Array um...
danke für die Idee, nur mit einem 1D-Array zu arbeiten, darauf wäre ich nicht gekommen, ich werds auch mal ausprobieren.
Mich interessiert mal, ob Du auch mit den Funktionen Signalverlauf erstellen/Komponenten lesen ... arbeitest? Mein erster Versuche bestand darin, ein 1D-Array aus mehreren Signalverläufen zu erstellen, wo ich dann auch das dt und Attribute wie Kanalnamen und Einheit mit angeben kann (http://www.labviewforum.de/attachment.php?aid=45947). Oder arbeitest Du lieber mit "reinen" Arrays so wie jetzt hier in dem Thread?
im Allgemeinen arbeite ich mit den "rohen" Arraydaten - das hat aber auch seine Gründe:
- bekannte und feste Sampleraten
- Datenverarbeitung wird manchmal einfache dadurch
- Target: auf cRIO/FPGA "braucht" man keine Waveforms
- Mischung verschiedenster Datenquellen (nicht nur DAQmx, sondern auch CAN, UDP-Botschaften, etc.)...
Aber wenn ich mal Waveforms nutze, dann natürlich auch mit den zugehörigen Funktionen.
danke, dass Du Dir noch etwas Zeit genommen hast, meine Frage bezüglich reinem Array oder der anderen Funktion mit den Signalverläufen zu beantworten.
Arbeitest Du lieber mit den Einzelgraphen oder auch mal mit dem Mischsignalgraph? Ich hab in meiner Anwendung verschiedene physikal. Größen, die man nicht alle in ein Diagramm packen kann (z.B. Weg, Kraft, Temperatur ...), darum hatte ich in meinen ersten Versuchen mehrere Einzelgraphen übereinander positioniert. Ich fand es manchmal unpraktisch, wenn ich bei einer der Größen die Zoom-Funktion verwendet hatte und die anderen Graphen dann anders liefen. Ich hatte dann eine Synchronisierungstaste eingebaut, welche alle Anzeigen wieder synchronisiert hat. Bei dem Mischsignalgraph hab ich eben nur eine x-Achse, die dann für alle Untergraphen gilt und ich finde es praktisch, dass man die Verläufe zwischen den Graphen hin- und herschieben kann (zumindest so lang man analoge und digitale Signale trennt). Mir ist deshalb der Mischsignalgraph irgendwie wegen der Vielzahl von verschiedenen Messgrößen, die aber alle die gleiche Zeitbasis haben, lieber.
Ich frage deshalb nochmal nach, weil Du mir in Deiner Antwort vom 23.08.2013 um 08:50 Uhr schriebst: "... und noch dazu einen Mischsignal-Graph benutzt... ". Hat der Mischsignalgraph vielleicht irgendwelche besonderen Nachteile? Oder arbeitet der im Vergleich zu den anderen Graphen ineffizienter?