LabVIEWForum.de - Array mit Schieberegister

LabVIEWForum.de

Normale Version: Array mit Schieberegister
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo,

da ich in meiner Studienarbeit eine große Messdatei einlesen und die Graphisch darstellen soll, musste ich mich mit dem Thema Array beschäftigen.
könnt ihr mir bitte sagen warum es mit Schieberegister und ersetzen schneller geht (siehe Bilder) ?

Ich habe folgenden Test ca 3 Minuten je Variante ausgeführt und den Wert gemittelt um Windows ein bisschen auszuklammern.
-1M Reihen und 5 Spalten
- Schiebe Register 4-5 Sekunden
- ohne Schiebe Register 8-9 Sekunden

gibt es vielleicht noch eine schnellere Lösung?

Vielen Dank und Grüße
Hallo Peter,

im Bild mit dem Schieberegister fehlt ein Draht in der innersten Schleife: du ersetzt immer das gleiche Element. Damit ist das Ergebnis nicht identisch!
(Außerdem musst du die N-Anschlüsse der FOR-Loops nicht verdrahten…)

Warum nicht so:
[attachment=52973] (ca. 0.7s auf meinem PC…)
Hmm
Hallo GerdW,

danke für deine schnelle Antwort! Das hatte ich übersehen.
Zu deinem Vorschlag:
Was mache ich mit Funktionen die nicht als Konvertierung von Array in Array vorhanden sind?
Wie zum Beispiel den Zeitstempel der in meiner Datei als String steht?
hatte mir schnell ein Array mit numerischen Werten über eine For Loop generiert und wollte die dann eben umformatieren.
Hallo Peter,

Zitat:Wie zum Beispiel den Zeitstempel der in meiner Datei als String steht?
Das war nicht Teil deiner Ursprungsfrage…
Zeitstempel musst du einzeln umwandeln.

Nachfrage: Was kam denn nun heraus, nachdem du den fehlenden Draht gezogen hast? Ist die ReplaceMethode immer noch schneller - oder die Autoindizierung?

Nachtrag:
Normalerweise sollte man direkt mit Arrays arbeiten - man kann z.B. die Spalte mit den Zeitstempeln nachträglich ins Array einfügen.
Aber: bei großen Datenmengen bekommt man dann schnell mal einen "out of memory"-Fehler. (Ich habe hier manchmal Messungen mit 20000 Zeilen mit je 250 Werten, die als Textdatei vorliegen. Wenn man die dann komplett am Stück einlesen und umwandeln will, kann es krachen…)
Mögliche Lösung: man kann zeilenweise arbeiten. Das kostet Zeit - beugt aber dem "out of memory" vor…
Es machte keinen Sinn ein Replace auszuführen, da ich ein nicht indiziertes Array angeschlossen habe und dadurch der Replace nicht ausgeführt wird.
Deshalb auch die 4 Sekunden, das war dann nur die Zeit, die das increment an der For Loop zum lesen brauchte.
Ich hab es mit Insert into probiert, das war SEHR langsam.

Ich formuliere meine Frage erneut:

wie sollten Werte aus einem Array, die einzeln formatiert werden sollen, auslesen und wieder zusammenfügen?

(29.04.2015 14:18 )GerdW schrieb: [ -> ]Hallo Peter,

Zitat:Wie zum Beispiel den Zeitstempel der in meiner Datei als String steht?
Das war nicht Teil deiner Ursprungsfrage…
Zeitstempel musst du einzeln umwandeln.

Nachfrage: Was kam denn nun heraus, nachdem du den fehlenden Draht gezogen hast? Ist die ReplaceMethode immer noch schneller - oder die Autoindizierung?

Nachtrag:
Normalerweise sollte man direkt mit Arrays arbeiten - man kann z.B. die Spalte mit den Zeitstempeln nachträglich ins Array einfügen.
Aber: bei großen Datenmengen bekommt man dann schnell mal einen "out of memory"-Fehler. (Ich habe hier manchmal Messungen mit 20000 Zeilen mit je 250 Werten, die als Textdatei vorliegen. Wenn man die dann komplett am Stück einlesen und umwandeln will, kann es krachen…)
Mögliche Lösung: man kann zeilenweise arbeiten. Das kostet Zeit - beugt aber dem "out of memory" vor…

Das Problem hatte ich schon und habe mir deshalb vor der Funktion "konvertieren" eine Abfrage gebaut, die mir sagt wie groß meine Datei ca ist (über Array größe und die zu erwartenden Datentypen) und dann gesplitet. Danach habe ich die Teile wieder zusammengeführt.
Hallo Peter,

Zitat:wie sollten Werte aus einem Array, die einzeln formatiert werden sollen, auslesen und wieder zusammenfügen?
Das Array am FOR-Loop-Eingang autoindizieren, in der Loop das Element formatieren und am Ausgang der Loop wieder autoindizierend zum Array zusammensetzen…

Das klappt mit rein numerischen Arrays sehr gut: LabVIEW kennt schon im Voraus die Anzahl der Werte und den Speicher, den die Elemente brauchen. Bei String-Arrays wird es komplizierter: hier kennt man zwar die Anzahl der Elemente, aber nicht deren Speicherbedarf - jeder String könnte unterschiedlich lang sein. Deshalb sind Operationen mit String-Arrays meist etwas langsamer als mit rein numerischen Daten - der LabVIEW-MemoryManager hat einfach deutlich mehr zu tun!
Danke!
Und welchen Vorteil hat es dann ein schieberegister zu benutzen? Hat das in LabView eine besondere Bedeutung in der Speicherbehandlung?
rein aus Interesse..
Hallo Peter,

Zitat:Hat das in LabView eine besondere Bedeutung in der Speicherbehandlung?
Ja. Das Schieberegister ist der Buffer für die Daten…

Zitat:Und welchen Vorteil hat es dann ein schieberegister zu benutzen?
Du hast nur noch einen internen Buffer für Daten und kannst per IndexArray/ReplaceArraySubset (oder mit der InPlace-Struktur) wahlfrei darauf zugreifen - ohne weitere (unnötige) Datenkopien zu erzeugen.

Wenn du aber wie in deinem Beispiel nicht wahlfrei, sondern auf jedes Element und eins nach dem anderen zugreifen willst, bietet sich die Autoindizierung an…
Ok, das Bedeutet ich splitte das Array auf. Numerische Werte und den Zeitstempel. Anzahl der möglichen Spalten gebe ich dann an eine ForLoop mit autoindexing und benutze dann die Funktion Zahl nach String. Das gebe ich dann wieder über autoindexing aus.
Habe ich das richtig Verstanden das dies die schnellste möglichkeit wäre?
Hallo Peter,

die wahrscheinlich schnellste Methode:
[attachment=52975]
Das heißt nicht, dass es auch die effizienteste Methode bzgl. Speicherbedarf ist…
Wie oben geschrieben: bei großen Arrays kannst du bei der hier gezeigten Variante schnell einen OutOfMemory-Fehler bekommen…
Seiten: 1 2
Referenz-URLs