19.03.2014, 18:04
Beitrag #1
|
Serial
LVF-Gelegenheitsschreiber
Beiträge: 75
Registriert seit: Mar 2014
8.2
2013
DE
|
Bestimmte Daten aus csv Datei in Array schreiben
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
|
|
|
19.03.2014, 18:49
Beitrag #2
|
jg
CLA & CLED
Beiträge: 15.864
Registriert seit: Jun 2005
20xx / 8.x
1999
EN
Franken...
Deutschland
|
RE: Bestimmte Daten aus csv Datei in Array schreiben
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
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
Einführende Links zu LabVIEW, s. GerdWs Signatur.
|
|
|
20.03.2014, 07:13
Beitrag #3
|
|
|
20.03.2014, 09:06
(Dieser Beitrag wurde zuletzt bearbeitet: 20.03.2014 09:11 von GerdW.)
Beitrag #4
|
GerdW
______________
Beiträge: 17.480
Registriert seit: May 2009
LV2021
1995
DE_EN
10×××
Deutschland
|
RE: Bestimmte Daten aus csv Datei in Array schreiben
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:
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…
|
|
|
20.03.2014, 09:13
Beitrag #5
|
Serial
LVF-Gelegenheitsschreiber
Beiträge: 75
Registriert seit: Mar 2014
8.2
2013
DE
|
RE: Bestimmte Daten aus csv Datei in Array schreiben
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".
|
|
|
21.03.2014, 07:36
(Dieser Beitrag wurde zuletzt bearbeitet: 21.03.2014 07:37 von Serial.)
Beitrag #6
|
|
|
21.03.2014, 08:18
Beitrag #7
|
jg
CLA & CLED
Beiträge: 15.864
Registriert seit: Jun 2005
20xx / 8.x
1999
EN
Franken...
Deutschland
|
RE: Bestimmte Daten aus csv Datei in Array schreiben
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
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
Einführende Links zu LabVIEW, s. GerdWs Signatur.
|
|
|
21.03.2014, 13:51
(Dieser Beitrag wurde zuletzt bearbeitet: 21.03.2014 13:53 von Serial.)
Beitrag #8
|
|
|
21.03.2014, 14:06
(Dieser Beitrag wurde zuletzt bearbeitet: 21.03.2014 14:07 von GerdW.)
Beitrag #9
|
GerdW
______________
Beiträge: 17.480
Registriert seit: May 2009
LV2021
1995
DE_EN
10×××
Deutschland
|
RE: Bestimmte Daten aus csv Datei in Array schreiben
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:
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…
|
|
|
21.03.2014, 14:18
|
jg
CLA & CLED
Beiträge: 15.864
Registriert seit: Jun 2005
20xx / 8.x
1999
EN
Franken...
Deutschland
|
RE: Bestimmte Daten aus csv Datei in Array schreiben
@Gerd: Immer noch das uninitialiserte Shift-Register. Das habe ich doch schon moniert!
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
Einführende Links zu LabVIEW, s. GerdWs Signatur.
|
|
|
| |