LabVIEWForum.de - Performance vom Dateneinlesen zu gering

LabVIEWForum.de

Normale Version: Performance vom Dateneinlesen zu gering
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo LabViewforum:

ich habe folgende Aufgabe zu bewältigen:

ich bekomme einen Datensatz einer Messung als txt Datei. Jede Zeile dieser Datei ist eine eigenständige Messung. In einer Messung werden mehrere Parameter gleichzeitig gemessen. In den obersten beiden Zeile befinden sich keine Messdaten sondern eine Kommentarzeile die mit # abgeschlossen wird und in der zweiten Zeile die Namen der Parameter die mit * abgeschlossen wird. Weiterhin wird jede Messung mit ? abgeschlossen. Die einzelnen Parameter in einer Messung werden durch ; voneinander getrennt.

Nun sollen die Daten wieder für LabView zur Weiterverarbeitung eingelesen werden. Dazu habe lich das VI Load Data geschrieben (unten angehängt). Die Daten werden eingelesen und dann für jede Messung in ein Control "Mustercluster" geschrieben. Alle Messungen sollen dann ein Array aus beschriebenen Musterclustern ergeben das den Ausgang des Vis bilden muss (Vorgabe vom Chef).
Außerdem sollte die Sache wenn irgendwie möglich mit dem Control Mustercluster nicht abgeschafft werden da es sich in vielen anderen SubVIs wiederfindet und quasi Kern des ganzen Projektes ist und je nach Messung geändert werden können sollte. Befindet sich in der text datei ein Parameter der nicht im Mustercluster vorhanden ist soll dieser auch nicht berücksichtigt werden. Befindet sich im Mustercluster ein Parameter der nicht in der txt Datei vorhanden ist soll dieser mit NAN oder 0 belegt werden.

Das Problem ist das es bei größeren Datenmengen relativ langsam geht. Bei 100 Messungen dauert es schon mehrere Sekunden. Die Dateien sollen aber später bis zu mehrere Tausend Messungen enthalten können.

Außerdem ist mir aufgefallen das am Anfang das Cluster langsam gefüllt wird spätere Cluster dann aber immer schneller gefüllt werden können.

Ich habe gelesen, dass der häufige Aufruf von Propertie Nodes die Performance verringert, daher habe ich noch das VI " Load data mit wenig Property Nodes" geschrieben bringt aber kaum einen Zeitvorteil.

Was kann ich verbessern so, dass man die Daten in relativ kurzer Zeit einlesen kann? Wenn es keine andere Möglichkeit gibt könnte ich zur Not das Format der Datei ändern ( aber nur wenn es unbedingt sein muss.

Wo kann ich mich gezielt informieren wie LabView intern und in den zur Verfügung gestellten VIs arbeitet. Was kostet am meisten Speicher und Rechenzeit?

Hoffe ihr könnt mir ein paar nützliche Tipps geben.

ich hänge mal meine beiden VIs an und eine Beispiel Daten txt datei.

MrStrom

Mist wie kann ich denn jetzt die VIS anhängen ???
Hallo mrstrom,

Zitat:Mist wie kann ich denn jetzt die VIS anhängen ???
volles editieren, unter dem Texteingabefeld...

Ansonsten aus deinem Text destilliert:
Datei mittels ReadFromTextfile einlesen. "?" rausfiltern. Mit ";" als Trennzeichen per SpreadsheetstringToArray umwandeln. Die ersten beiden (Array-)Zeilen getrennt auswerten. Den Rest in Zahl (oder was auch immer gewünscht ist) umwandeln.

Zitat:Wo kann ich mich gezielt informieren wie LabView intern und in den zur Verfügung gestellten VIs arbeitet. Was kostet am meisten Speicher und Rechenzeit?
Menü Tools->Profile...
Offtopic2
:hmmBig Grinu hast doch schon VIs hochgeladen?
Hier ein Link: http://www.labviewforum.de/Tutorial-Upload...hots-t5907.html
Gruß, Jens
Ja aber bei mir gibt es den button durchsuchen aufeinmal nicht mehr
Ah so jetzt hab iches. ich glaube das lag an meinem Internetbrowser

hier die Daten und die vis

die LabViewversion ist LabView2009 da ich sie in der uni auf einem rechner erstellt habe
Der Mustercluster wäre noch ganz praktisch.

<edit> in der test2.txt sind die Messungen nicht mit ? terminiert, und nur die erste Zeile ist durch ; getrennt, ist das so korrekt? <edit>

Gruß Richard
Ich löse so etwas ohne PropertyNodes.
Die einträge im Cluster sind scheinbar immer die Gleichen, dann kannst du dir doch einfach eine Case Struktur mit diesen anlegen und dann über Bundle by Name füllen.
Inwieweit das bei größeren Dateien Performat ist kann ich nicht genau sagen, da deine Testdatei nicht deinem Beschriebenem Format entspricht.
In dem unten angegebenen Beispiel habe ich die beiden ersten Messwertzeilen auf deine Beschreibung geändert.

Du kannst über die Größe des Arrays auch schon das Ergebnis Array indizieren, und immer nur ersetzen, das müsste schneller gehen als das Autoindizieren der Forschleife.
Über die Clusterkonstante kannst du die Standardwerte definieren. Der Defaultcase wird bei umbekannten Messwertbezeichnern druchlaufen, also werden diese herausgefiltert.

Über die Anzal kannst du die Menge der einzulesenden Zeichen Steuern, -1 -> gesamte Datei
Das ersetzen der ? durch einen Zeilenumbruch erzeugt das 2D-Array

Gruß Richard


[attachment=31266]
Hallo mrstrom,

wer hat sich bloß dieses Format ausgedacht...

Zitat:eine Kommentarzeile die mit # abgeschlossen wird und in der zweiten Zeile die Namen der Parameter die mit * abgeschlossen wird. Weiterhin wird jede Messung mit ? abgeschlossen. Die einzelnen Parameter in einer Messung werden durch ; voneinander getrennt.

Ausschnitt der Text-Datei:
Zitat:17.11.2010 15:25
#
Anzahl Spektren; v_block[V]; v_inject[V]; v_drift[V]; v_aperture[V]; Injection Time; Numeric; Numeric 2; Numeric 3; Spektrum*
54795,000000; -2,024690; 249,973020; 2027,981440; 0,731300; 100,000000; 0,000000; 0,000000; 0,000000; 1,197910' 1,575700' 1,249882' 1,147089' 1,122492' 1,147639' 1,091119' 0,232609' 1,186198' 1,162226'

Format mal aufgedröselt:
- erste Zeile mit Datum + Uhrzeit
- zweite Zeile mit einem #
- dritte Zeile mit Kanalnamen, beendet mit einem *
- vierte Zeile: zuerst die Werte zu den Kanalnamen, jeweils durch ein ";" abgetrennt, danach (ohne Zeilenende dazwischen!) die Spektrumswerte, diesmal getrennt mit einem Hochkomma (! Wieso das denn?)
- ganz am Ende: wieder ein ";", ein "?", ein ";" mittendrin noch ein Zeilenende...
Und noch besser: zusätzlich zu den Trennzeichen noch jede Menge Leerzeichen (statt einfach ein Tab dazwischen zu setzen)

Also Lösung:
-Datei lesen
- am # splitten, Datum+Uhrzeit auswerten
- am * splitten, Kanalnamen auswerten (falls nötig, anscheinend sind die ja feststehend, da du schon einen Cluster vorbereitet hast)
- Werte entsprechend Kanalnamen lesen, (z.B. mit einer FOR-Schleife), die Werte mit BundleByName in den vorbereiteten Cluster eintragen
- am nächsten ";" splitten (dies wäre das nach den Spektrumswerte), per SpreadsheetstringToArray mit Trennzeichen "'" (Hochkomma) in ein Array of DBL umwandeln, in Cluster eintragen
Fertig!

So sieht das aus (ohne das BundleByName und einige kleinere AuswertungenSmile):
[attachment=31268]
Laden deiner Datei in unter 1s...

Zitat:Wenn es keine andere Möglichkeit gibt könnte ich zur Not das Format der Datei ändern ( aber nur wenn es unbedingt sein muss.
Mein Vorschlag:
- Sinnvoller Einsatz von Zeilenendezeichen
- statt mehrerer Leerzeichen nur ein Tab zwischen den Werten, Verzicht auf ";" und Hochkomma (da ja schon das Tab als Trennzeichen vorhanden und ausreichend ist)
- wenn Spektrumswerte eindimensional sind, dann alle Werte untereinander oder zumindest auf maximal 16 Werte pro Zeile begrenzt (dann meckert Excel nicht beim Einlesen deiner Textdatei!), Anzahl der Werte steht ja schon im Header
Quick&dirty Variante, kurz vor der Tagesschau:
Lv10[attachment=31272]
[attachment=31275]

Gefühlte Dauer: 300ms
Anm: Die Steuerzeichen #,*,? werden eigentlich gar nicht gebraucht, die Zeilenendezeichen allein reichen für die Separierung der Daten aus. Hier im VI wurde die Separierung der Daten allein mit Zeilenendezeichen gemacht und die Steuerzeichen entfernt.

Die andere Metoide wäre, die Zeilenendezeichen aus der Datei zu entfrenen bzw. zu ignorieren und zur Separierung der Daten allein die Steuerzeichen zu verwenden. Das ist wohl mehr im Sinn des Erfinders.
Hallo,

erstmal vielen Dank an euch für eure sehr schnellen Antworten.

@Richard:
ich hänge gleich mal das Mustercluster an damit du dir ein besseres Bild machen kannst. Es müssten aber alle Parameter in allen Zeilen durch ein ; getrennt sein. Das Spektrum betrachte ich als ein Parameter mit 2000 Werten. Im Spektrum habe ich die einzelnen Werte mit ' getrennt.
Wahrscheinlich kann dein editor die txt datei nicht ordentlich darstellen weil sie so viele Spalten hat. Bei mir geht es besser mit Word Pad.
Außerdem verstehe ich nicht warum du ein 2D Array brauchst? und die Messdaten werden bei dir auch nicht den richtigen Überschriften zugeordnet. Außerdem steigt die Anzahl der Spektren nicht immer um 1 sie kann auch mal um 2 oder 3 springen, da die Hardware manchmal einzelne Spektren nicht einliest.

@GerdW:

Das Format habe ich mir ausgedacht, und sehe auch langsam ein das es nicht gerade eine gute Wahl war. Aber haben die vielen Trennzeichen den einen großen Einfluss auf die Performance? Es müsste doch eigentlich egal sein ob man auf einen Zeilenumbruch schaut oder auf ein Zeilenumbruch?
Zu deiner Lösung: Ja sie leuchtet mir ein aber das größte Problem ist für mich die Daten die jetzt einzeln in deiner Lösung vorliegen, dynamisch in einem Cluster (bei mir Mustercluster) zusammenzufügen in dem die Daten den einzelnen Clusterelementen den Kanalnamen richtig zugeordnet werden.

Woher weißt du dass die Anzahl der Werte im Header steht?


@Alle

Gibt es irgendwelche Grundregeln was besonders schlecht für die Performance ist?
Wie z.B Property Nodes, Indizierung durch Schleifen, Referenzen.

Wie finde ich heraus welches VI wie auf den Speicher zugreift und ggf. Kopien der Daten anlegt und so weiter. Gibt es Möglichkeiten zu sehen was intern passiert oder ist alles wirklich so gut gekapselt?

Ich habe hier im Forum gelesen das ein Mitglied in einem ähnlichen Fall zum TDMS Datenformat geraten hat, dann wären für mich die Formatprobleme schnell gelöst, aber die Datei wird leider sehr groß. Was haltet ihr von diesem Format in meinem Fall?
Seiten: 1 2
Referenz-URLs