Große *.txt in *.tdms konvertieren -> hohe Speicherauslastung
Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
Große *.txt in *.tdms konvertieren -> hohe Speicherauslastung
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
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
Habe selbst keine Ahnung, aber warum benutzt du nicht einfach das VI zur Konvertierung in TMS/TDMS?
Damit man das VI testen kann, wäre es sinnvoll, wenn du 100 oder 1000 von den 12 Milionen Textzeilen noch posten würdest.
10.07.2012, 08:46 (Dieser Beitrag wurde zuletzt bearbeitet: 10.07.2012 08:50 von jg.)
RE: Große *.txt in *.tdms konvertieren -> hohe Speicherauslastung
Hallo,
aus eigener Erfahrung: Die tdms-API von 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.
Gruß, Jens
@Lucki: Das VI gibt es in LV8.6 noch nicht.
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!
RE: Große *.txt in *.tdms konvertieren -> hohe Speicherauslastung
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
(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
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!
RE: Große *.txt in *.tdms konvertieren -> hohe Speicherauslastung
(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 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.