LabVIEWForum.de - Timingprobleme bei großen Arrays

LabVIEWForum.de

Normale Version: Timingprobleme bei großen Arrays
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hi @ all

Ich bekomme meine Daten über ein USB-Interface. Diese Daten möchte ich in einem großen Array schreiben um dies anschließend visuell darzustellen. Jedoch nimmt die Verarbeitungszeit mit der Arraygröße deutlicht zu, so das ich nicht mehr schnell genug auf mein USB-Interface zugreifen kann. Dadurch kommt es zum Bufferüberlauf und somit gehen Daten verloren. Es kommt alle 5ms ein Datenblock von 2000 Bytes. Jedoch dauert das Schreiben der Daten schon ca. 15ms (so ca. beim 999 Block) Bei den ersten Blöcken braucht LabVIEW nur ca 1ms um die Daten in das Array zu speichern (siehe Arrays mit Zeiten).

Ich benutze ich meinem Programm ein Subvi. Diese setzt ein Flag sobald genügend Daten vorhanden sind. Ist dies der Fall werden die Daten (die 2000 Bytes), die das Subvi liefert, in das dynamische Array geschrieben. Dadurch entsteht ein zweidimensionales Array. Damit ich das Programm auch ohne USB-Modul zur Verfügung stellen kann habe ich das Subvi entfernt. Es bleibt eine For-Schleife über, die ein zweidimensionales Array füllt. Jedoch kann man da schon deutlich erkennen, dass das Abspeichern der Daten im zweidimensionalen Array mit der größe des Array zunimmt (siehe Zeitarray).

In C++ hatte ich mal das Thema dynamische verkettet Listen, die den Vorteil besitzen, das auch große Array die gleiche Verarbeitungszeit besitzen. Ich dachte LabVIEW macht es auch so.

[attachment=6144]

[attachment=6145]

Wie kann ich es besser machen? Habe schon versucht ein großes Array zu erstellen und dann mit "Teilarray ersetzen" (diese Funktion braucht aber noch viel mehr Zeit) Die automatische Indizierung (bei der For-Schleife) geht bei mir nicht, da ich die Daten nur beim gesetzten Flag in das Array eintragen möchte (der Flase-Fall im Case würde das Array überdimensional vergrößern)

Grüsse

JoeDoe
Die Insert into Array Funktion solltest du besser wieder gegen ein Replace Array Subset ersetzen. Build Array und Insert Into Array innerhalb einer Schleife sind absolute Performance Killer.

Die Aussage, dass das Replace Array ebenfalls zu Zeitproblemen führt halte ich für Falsch. Ich habe bisher noch nie so ein Problem festgestellt, im Gegenteil das ist die schnellste Methode in LV die Daten zwischenzuspeichern.
Danke ich habe es noch mal getestet und Du hast recht. Auf einmal braucht es nicht mehr so viel Zeit. Jedoch hat es den Nachteil das ich vorher genau wissen muss wie groß das Array wird. Für alle die es interessiert hier das geänderte Beispiel. Es benötigt jetzt ca. 0ms für einen Eintrag. Lol

[attachment=6146]

Noch mals vielen Dank für Deine Antwort. Vielleicht kennt ja jemand noch ein Lösung für eine dynamisches Array.

Grüsse

JoeDoe1979
' schrieb:Jedoch hat es den Nachteil das ich vorher genau wissen muss wie groß das Array wird.
Falsch: Die genaue Größe mußt Du nicht vorher wissen, sondern nur, wie groß es maximal werden könnte. Das wirst Du in jedem Fall wissen, notfalls mußt Du es eben mit Sicherheitsfaktor 10 abschätzen

Die Arraybildung erfolgt in 3 Schritten:
1. Initialisierung des Array mit der maximalen Elementezahl
2. Bildung des Arrays mit der Ersetzen-Funktion. Bei dieser Operation es so gut wie unvermeidlich, daß die Anzahl der Ersetzungen mitgezählt wird. D.h Du weißt danach ohne weiteres Zutun, wie groß Dein Array wirklich ist.
3. Abschneiden der überflüssigen Elemente mit der Funktion "Aus Array entfernen".

Richtig ist aber: Das Problem mit der Größe des Arrays hast Du erkannt. Es ist aber nicht so kompliziert, wie Du vermutet hattest (daß man die Größe vorher berechnen oder kennen muß), aber eben auch nicht so einfach, wie von i2dx erklärt (daß man die eine Funktion einfach durch eine andere ersetzt). Die Wahrheit liegt in der Mitte.
' schrieb:aber eben auch nicht so einfach, wie von i2dx erklärt (daß man die eine Funktion einfach durch eine andere ersetzt). Die Wahrheit liegt in der Mitte.

ja okeh ... ich würde mal sagen, wenn man sonst nicht viel Speicher braucht kann man schon mal 64 MB RAM (entsprechend großen Hauptspeicher vorausgesetzt) für Daten puffern allokieren. Wenn's mehr Daten werden, sollte man sich darüber Gedanken machen, ob man dann entsprechend auf die Festplatte auslagert ...

64 MB, das ist immerhin ein 2D Array mit 2 x 4194304 Doubles, da muss man schon lang und viel oder sehr schnell messen ...
oder anders ausgedrückt: bei 10 kHz, 2 Kanälen sind das dann immerhin knapp 7 Minuten Messwerte am Stück ...
Also wenn ein Datenblock 2000Bytes besitzt und dieser wird mit 200Hz aktualisiert dann komme ich auf fogendes Ergebnis:

2000Bytes *200 = 400.000 Bytes pro Sekunde --> mal 60 =24MByte pro Minute --> 3 Minuten = 72 MByte

Aber wir wollen nur einige Sekunden Messen dafür reicht es :-)

Grüsse

JoeDoe1979
Referenz-URLs