LabVIEWForum.de
Bestimmte Daten aus csv Datei in Array schreiben - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: Datenbank & File IO (/Forum-Datenbank-File-IO)
+---- Thema: Bestimmte Daten aus csv Datei in Array schreiben (/Thread-Bestimmte-Daten-aus-csv-Datei-in-Array-schreiben)

Seiten: 1 2 3


Bestimmte Daten aus csv Datei in Array schreiben - Serial - 19.03.2014 18:04

Guten Abend,

ich Rahmen eines Projekts meiner Hochschule bin ich an einem Projekt bei. Es erkläre die Problemstellung.

Ich habe eine .csv Datei, welche um die 200MB groß ist. Diese enthält vier Spalten mit Werten.

Dies sieht ungefähr so aus:

Header
Header
Header
wert,wert,wert,wert
wert,wert,wert,wert
wert,wert,wert,wert
wert,wert,wert,wert
wert,wert,wert,wert
wert,wert,wert,wert
wert,wert,wert,wert
wert,wert,wert,wert
wert,wert,wert,wert

Die Datei hat am Anfang und Ende ziemlich viele unnütze "nullen" welche nicht dargestellt werden müssen. Es erfolgt bei der Messung ein "Ereignis"

Es geht darum, die Messwerte in einem XY Plot darzustellen. Es ist mir schon gelungen, die csv Datei in vier Arrays zu zerlegen, damit ich diese als Quelle für den XY Graph benutzen kann. Das Problem besteht darin, dass das nur bei einer relativ kleinen Datei funktioniert. Bei einer zu großen Datei füllt sich der Arbeitsspeicher und es erscheint eine Fehlermeldung.

Mein Ansatz zur Lösung des Problems (was ich aber bisher noch nicht realisieren konnte):
1.
Bevor die Daten in die vier Arrays geschrieben werden, muss ich irgendwie hinbekommen, dass nur die Zeilen hineingeschrieben werden, welche eine bestimmte Schwelle überschritten haben. Es gibt eine Menge an Zeilen mit werten im 10^(-3) bereich. Also sobald einer der vier Werte kleiner als z.B. 0,1 ist, soll die ganze Zeile übersprungen werden. So wird nur der "wichtige" Augenblick in das Array geschrieben.

2.
Die csv Datei "analysieren" und bestimmen in welcher Zeile die Werte Größer werden. Dann einen definierten bereich abspeichern.



Wie gesagt, ich habe es hinbekommen dass es mit einer relativ kleinen Datei funktioniert (30MB). Aber mit der Originaldatei klappt es nicht.


MfG


RE: Bestimmte Daten aus csv Datei in Array schreiben - jg - 19.03.2014 18:49

Zeig mal dein VI (i.e. bitte hochladen).

Wahrscheinlich musst du die Datei blockweise einlesen. Auf einen Schlag geht bei der Größe wahrscheinlich schief. Oder kannst du was an der Dateierstellung ändern? Dann bietet sich bei solchen Mengen TDMS als Dateiformat an.

Gruß, Jens


RE: Bestimmte Daten aus csv Datei in Array schreiben - Serial - 20.03.2014 07:13

(19.03.2014 18:49 )jg schrieb:  Zeig mal dein VI (i.e. bitte hochladen).

Wahrscheinlich musst du die Datei blockweise einlesen. Auf einen Schlag geht bei der Größe wahrscheinlich schief. Oder kannst du was an der Dateierstellung ändern? Dann bietet sich bei solchen Mengen TDMS als Dateiformat an.

Gruß, Jens

Okay, hier das VI


RE: Bestimmte Daten aus csv Datei in Array schreiben - GerdW - 20.03.2014 09:06

Hallo Serial,

THINK DATAFLOW!

Als allererstes mal alle lokalen Variablen durch Drähte ersetzen. Du hast da nichts weiter als einen großen Haufen RACE CONDITIONS!
Dann die unsinnigen Konstrukte entfernen: Warum musst du dein X-Achsen-Array auf ein 2D-Array aufblasen?

Dann sollte es in etwa so aussehen:
[attachment=49047]

Und immer daran denken: THINK DATAFLOW!

Dein eigentliches Problem besteht darin, dass du deine große Datei immer im Ganzen versuchst einzulesen. Dies wird bei großen Dateien unweigerlich zu einem "Memory full" führen, spätestens beim Umwandeln von String-Array nach DBL-Array. Dein "XY Graph ExpressVI" hat ebenfalls interne Speicher, auch die füllen sich und damit den Arbeitsspeicher!
Lösung:
Die Daten immer blockweise einlesen (z.B. mit jeweils 1000 Zeilen) und daran gleich deine Filterung vornehmen…

Und: Du bist nicht der erste mit diesem Problem. Es gibt sicherlich schon passende Lösungsvorschläge hier im Forum…


RE: Bestimmte Daten aus csv Datei in Array schreiben - Serial - 20.03.2014 09:13

Vielen Dank schonmal.

Das X-Array habe ich nur zur besseren Übersicht zu einem 2D Array aufgeblasen. Ich muss noch dazu sagen, dass ich mich erst seit circa 5 Tagen intensiver mit LV beschäftige, daher die "Anfängerfehler".


RE: Bestimmte Daten aus csv Datei in Array schreiben - Serial - 21.03.2014 07:36

Jetzt funktioniert es. Ich habe eine FOR Schleife entwickelt, die immer x Zeilen aus der csv Datei liest und per Schieberegister in ein 1D-Array schiebt. Jedoch dauert es ziemlich lange, eine 200MB Datei einzulesen (bestimmt so 20 sekunden). Ich denke mal, dass das aufgrund der "schlechten" Hardware meines PCs auftritt (1 GHZ, 1GB Ram).

Oder ist das was in der Programmierung, was viel Rechenzeit kostet? Werde mir jetzt erstmal ein Kapite in einem Buch angucken zum Thema Professionelle Programmentwicklung.


RE: Bestimmte Daten aus csv Datei in Array schreiben - jg - 21.03.2014 08:18

Immer nur 10 Zeilen einlesen ist natürlich ziemlich wenig. Da kannst du schon mehr pro Durchlauf machen. Was du aber dringend machen musst: Verzichte auf Read From Spreadsheet-File und mach das File-Lesen & Wandeln nach Zahlen selber mit den Read-File Operationen. Dann sparst du dir nämlich das dauernde implizite File-Öffnen & -Schließen. Dann musst (!) du das Schieberegister mit einem leeren Array initialisieren, ansonsten hängst du bei mehrfachen Aufrufen des VIs immer wieder Daten an Datensätze aus anderen Files an.

Sehr viel ließe sich verbessern und optimieren, wenn du im File-Header eine Information über die Anzahl der Datensätze im File hättest. Dann könntest du ein Zahlen-Array vorinitialisieren. Das ständige Build-Array ist nämlich auch ein Zeitfresser.

Gruß, Jens


RE: Bestimmte Daten aus csv Datei in Array schreiben - Serial - 21.03.2014 13:51

Das mit den 10 zeilen stimmt. Also lieber mehr Zeilen pro Durchlauf verändern und dann dafür weniger Durchläufe.
Das mit dem Read-File Operationen versuche ich mal hinzubekommen (als verbesserung des programs). Den Header Analysieren ist auch kein Prolem, da kann man die Anzahl der Messpunkte herauslesen.


Gibt es eigentlich eine Möglichkeit, nachdem mein Programm durchgelaufen ist, das erstellte Array zu löschen?
Achja, und ich bin momentan am werkeln, wie man die Anzahl der Zeilen des Headers bestimmt. Ich weiss, dass es immer 10 Zeilen sind aber wäre besser das "allgemein" zu programmieren, falls der Header mal ne Zeile länger ist.


RE: Bestimmte Daten aus csv Datei in Array schreiben - GerdW - 21.03.2014 14:06

Hallo serial,

welches Array willst du "löschen"? Üblicherweise schreibt man dann eine leere Array-Konstante in eine lokale Variable des Array-Indicators…

Deine innere FOR-Loop könnte auch so aussehen:
[attachment=49073]

Zitat:Achja, und ich bin momentan am werkeln, wie man die Anzahl der Zeilen des Headers bestimmt. Ich weiss, dass es immer 10 Zeilen sind aber wäre besser das "allgemein" zu programmieren, falls der Header mal ne Zeile länger ist.
Dazu sollte man wissen, wie der Header aussieht bzw. woran man das Ende des Headers oder den Anfang der Daten erkennt…


RE: Bestimmte Daten aus csv Datei in Array schreiben - jg - 21.03.2014 14:18

@Gerd: Immer noch das uninitialiserte Shift-Register. Noe Das habe ich doch schon moniert!