LabVIEWForum.de
Große *.txt in *.tdms konvertieren -> hohe Speicherauslastung - 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: Große *.txt in *.tdms konvertieren -> hohe Speicherauslastung (/Thread-Grosse-txt-in-tdms-konvertieren-hohe-Speicherauslastung)



Große *.txt in *.tdms konvertieren -> hohe Speicherauslastung - Thom.A.s - 10.07.2012 08:20

Guten Morgen!

Erst einmal Gratulation zum Forum. Ich habe zwar seit 4 Jahren LabVIEW, bin aber noch blutiger Anfänger da ich es viel zu selten nutze. Hier im Forum finde ich dann sehr häufig Hilfe bei Fragestellungen.

Jetzt steh ich aber vor einem Problem, wo ich über die Suchfunktion hier nicht weiter komme:
Wir führen häufig Messungen durch, bei denen wir ca. 10 min lang Echtzeit-Schalldaten mit einer Abtastrate von 25.6 kHz aufnehmen. Das Problem ist, dass wir mit unserer Software die Daten nur als Textdatei speichern können. Die haben dann schnell mal eine Größe von 500 MB. Die Dateien kann ich dann mit Diadem nicht einlesen. Also habe ich mir gedacht, ich konvertiere die Daten mittels LabVIEW zu einer TDMS-Datei.

Zunächst hab ich es mit dem VI "Aus Tabellenkalkulationsdatei lesen" versucht. Dafür reichte der Speicher von LabVIEW aber nicht aus. Zurzeit lese ich die Daten Zeilenweise über eine Schleife aus der Textdatei mit dem VI "Aus Textdatei lesen" aus und speicher sie dann direkt in eine TDMS-Datei. Dabei steigt die Speicherauslastung allerdings enorm an. Irgendwann bei ca. 12.000.000 Zeilen gibt es dann die Fehlermeldung "-2500 ist bei TDMS: Schreiben in .vi aufgetreten". Im Taskmanager hat LabVIEW in diesem Moment eine Speicherauslastung von 1 GB.

Hat vielleicht einer eine Idee, was ich besser machen kann?


RE: Große *.txt in *.tdms konvertieren -> hohe Speicherauslastung - GerdW - 10.07.2012 08:34

Hallo Thomas,

1) Du könntest deine Textzeile direkt in ein 1D-Array umwandeln, wenn du bei SpreadsheetstringToArray eine passende Konstante anschließt.
2) Das nachfolgende ArraySubset wird dann auch einfacher...
3) Alternativ mehrere Zeilen mit einmal lesen.
4) Wenn man eine Datei öffnet, steht die FilePos automatisch schon auf start. Man muss sie also nicht explizit setzen...


RE: Große *.txt in *.tdms konvertieren -> hohe Speicherauslastung - Lucki - 10.07.2012 08:43

Habe selbst keine Ahnung, aber warum benutzt du nicht einfach das VI zur Konvertierung in TMS/TDMS?
[attachment=40606]
Damit man das VI testen kann, wäre es sinnvoll, wenn du 100 oder 1000 von den 12 Milionen Textzeilen noch posten würdest.


RE: Große *.txt in *.tdms konvertieren -> hohe Speicherauslastung - jg - 10.07.2012 08:46

Hallo,

aus eigener Erfahrung: Die tdms-API von Lv86_img offenbart gerade, wenn man eine tdms-Datei Zeile für Zeile erstellt, ein Speicherleck.
Abhilfe:
1) Blockweise die Daten aus der txt-Datei lesen (s. Hinweis Gerd).
2) Durch Setzen einer tdms-Eigenschaft (s. Screenshot) kann man erreichen, dass die tdms-API erst einmal die Daten im Speicher sammelt und dann rausschreibt. Das verringert das Speicherleck der tdms-API.
[attachment=40607]
Gruß, Jens


@Lucki: Das VI gibt es in LV8.6 noch nicht.


RE: Große *.txt in *.tdms konvertieren -> hohe Speicherauslastung - Thom.A.s - 10.07.2012 10:24

Hallo Leute,

vielen Dank für die schnellen Tipps.

Wenn ich jetzt 1000 Zeilen pro Schleife auslesen, bekomme ich ja ein 1D-Array. Die Daten pro Zeile aus dem Array kriege ich jetzt nicht mehr vernünftig getrennt.

Ich hab mal im Anhang die Messdatei mit weniger Zeilen eingefügt. Ab Zeile 26 sind die Messdaten eingetragen. Die Daten sind per Tabulator getrennt, wobei der erste Eintrag pro Zeile immer leer ist. In der Beispieldatei befindet sich nur ein Kanal, es können aber auch mehr sein.


RE: Große *.txt in *.tdms konvertieren -> hohe Speicherauslastung - jg - 10.07.2012 10:35

(10.07.2012 10:24 )Thom.A.s schrieb:  Wenn ich jetzt 1000 Zeilen pro Schleife auslesen, bekomme ich ja ein 1D-Array. Die Daten pro Zeile aus dem Array kriege ich jetzt nicht mehr vernünftig getrennt.
Wo ist das Problem? Meinen Screenshot angeschaut? Einfach das 1D-String-Array in einen Tabellenstring wandeln!
Header im ersten Schleifendurchlauf entfernen, der Rest sind hoffentlich Messwert-Zeilen.

Gruß, Jens


RE: Große *.txt in *.tdms konvertieren -> hohe Speicherauslastung - Thom.A.s - 10.07.2012 10:58

(10.07.2012 10:35 )jg schrieb:  
(10.07.2012 10:24 )Thom.A.s schrieb:  Wenn ich jetzt 1000 Zeilen pro Schleife auslesen, bekomme ich ja ein 1D-Array. Die Daten pro Zeile aus dem Array kriege ich jetzt nicht mehr vernünftig getrennt.
Wo ist das Problem? Meinen Screenshot angeschaut? Einfach das 1D-String-Array in einen Tabellenstring wandeln!
Header im ersten Schleifendurchlauf entfernen, der Rest sind hoffentlich Messwert-Zeilen.

Das Problem liegt eindeutig am User, der vor LabVIEW sitzt Wink Ich hab einfach zu wenig Erfahrung. Ich seh gerade, ich hatte in meinem letzten Beitrag das falsche VI hochgeladen. Ich häng nochmal mein aktuelles an (der Richtigkeit halber), versuch es aber jetzt nochmal selbst.

Danke und Gruß,

Thomas


RE: Große *.txt in *.tdms konvertieren -> hohe Speicherauslastung - Thom.A.s - 11.07.2012 08:57

Guten Morgen,

das VI läuft jetzt und funktioniert prächtig. Vielen Dank für die guten Tipps!