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 

Timingprobleme bei großen Arrays



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!

15.04.2007, 14:01 (Dieser Beitrag wurde zuletzt bearbeitet: 15.04.2007 14:07 von joedoe1979.)
Beitrag #1

joedoe1979 Offline
LVF-Grünschnabel
*


Beiträge: 40
Registriert seit: Sep 2006

8.5.1
2005
de

23654
Deutschland
Timingprobleme bei großen Arrays
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.


Sonstige .vi  test.vi (Größe: 12,79 KB / Downloads: 249)


   

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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
15.04.2007, 15:56
Beitrag #2

cb Offline
LVF-SeniorMod


Beiträge: 1.731
Registriert seit: Feb 2006

2018SP1
2001
EN

40xxx
Deutschland
Timingprobleme bei großen Arrays
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.

http://www.rotabench.com - rotierende Prüfstände nach dem Baukasten-Prinzip
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
15.04.2007, 16:41
Beitrag #3

joedoe1979 Offline
LVF-Grünschnabel
*


Beiträge: 40
Registriert seit: Sep 2006

8.5.1
2005
de

23654
Deutschland
Timingprobleme bei großen Arrays
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


Sonstige .vi  test3.vi (Größe: 13,53 KB / Downloads: 199)


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

Grüsse

JoeDoe1979
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
15.04.2007, 17:44 (Dieser Beitrag wurde zuletzt bearbeitet: 15.04.2007 18:14 von Lucki.)
Beitrag #4

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

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
Timingprobleme bei großen Arrays
' 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.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
15.04.2007, 19:54
Beitrag #5

cb Offline
LVF-SeniorMod


Beiträge: 1.731
Registriert seit: Feb 2006

2018SP1
2001
EN

40xxx
Deutschland
Timingprobleme bei großen Arrays
' 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 ...

http://www.rotabench.com - rotierende Prüfstände nach dem Baukasten-Prinzip
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.04.2007, 10:46
Beitrag #6

joedoe1979 Offline
LVF-Grünschnabel
*


Beiträge: 40
Registriert seit: Sep 2006

8.5.1
2005
de

23654
Deutschland
Timingprobleme bei großen Arrays
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
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
  Änderung von großen Cluster (Type Def.) führt zu out of Memory exeption spacz 8 6.566 28.10.2019 09:01
Letzter Beitrag: spacz
  Auswahl eines Arrays anhand des Wertes eines zweiten Arrays treffen alan 2 4.591 19.02.2015 16:12
Letzter Beitrag: alan
  Gutes LV Design bei großen Programmen elhorst 31 20.926 18.09.2014 06:31
Letzter Beitrag: elhorst
Bug Arrays... immer wieder Arrays nurso 6 7.506 15.08.2014 10:39
Letzter Beitrag: Lucki
  Wie sehr großen Cluster vermeiden? Matze 10 9.411 31.10.2013 17:21
Letzter Beitrag: macmarvin
  Schneller Umgang mit großen Arrays curassas 6 6.473 26.09.2011 13:13
Letzter Beitrag: eb

Gehe zu: