LabVIEWForum.de
Messkurven aus TDMS auslesen - Nicht genügend Speicher zum Abschließen der Operation - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Messkurven aus TDMS auslesen - Nicht genügend Speicher zum Abschließen der Operation (/Thread-Messkurven-aus-TDMS-auslesen-Nicht-genuegend-Speicher-zum-Abschliessen-der-Operation)



Messkurven aus TDMS auslesen - Nicht genügend Speicher zum Abschließen der Operation - jeannyLab - 18.11.2011 23:30

Hallo zusammen!

Ich muss für meine Semesterarbeit mehrere Messkurven (mit Unmengen an Punkten) aus TDMS-Dateien auslesen und weiterverarbeiten.

Im Moment versuche ich das einfach über eine FOR-Schleife, über die ich eine TDMS-Datei nach der anderen öffne, mir die gewünschten Kurven auslese und die ganzen Werte dann in einem Array zusammenfüge(wie im anhängenden JPEG erkennbar).

Jedoch bereits bei zwei der riesigen TDMS-Dateien (jede hat ungefähr 230 MB) geht das Ganze irgendwie in die Knie und die Fehlermeldung 'Nicht genügend Speicher zum Abschließen dieser Operation' erscheint.

Gibt es eine Möglichkeit, das effizienter zu programmieren oder mache ich irgendeinen Fehler?

Danke Euch schon mal sehr!

lg jeanny


RE: Messkurven aus TDMS auslesen - Nicht genügend Speicher zum Abschließen der Operation - DuffiDuck - 19.11.2011 12:07

Hallo,

muss die Schleife wirklich so schnell laufen? Probier mal eine Durchlaufzeit von 50 oder 100ms?

Sprich Programming > Timing > wait (ms) und eben eine zeit anhängen

mfg duffiBadewanne_2_2


RE: Messkurven aus TDMS auslesen - Nicht genügend Speicher zum Abschließen der Operation - Der_Elch - 19.11.2011 12:28

Da du weißt wie groß dein Array wird, initialisiere es zuerst und dann erstze die einzelnen Stellen.

Was sagt der Task Manager? Wie groß wird der Speicherplatzbedarf / Auslastung?


RE: Messkurven aus TDMS auslesen - Nicht genügend Speicher zum Abschließen der Operation - jeannyLab - 19.11.2011 13:02

Danke Euch für die schnelle Hilfe!

Also das Einfügen einer Wait-Time hat leider nichts genützt, auch nicht bei 300 ms.

Die CPU-Auslastung liegt nur bei etwa 25 - 30 %, allerdings wird fast mein gesamter 2 GB Arbeitsspeicher 'aufgefressen'. Interessanterweise braucht Labview auch immer noch über 1 GB Arbeitsspeicher, wenn ich das VI gestoppt habe. Erst wenn ich das VI neu starte, kommt er runter.

Ich weißt ja vor dem Schleifenstart nicht genau, wie groß mein Array sein wird, da das von der Anzahl der Messpunkte jeder TDMS-Datei abhängt und die auch in den verschiedenen TDMS-Dateien etwas unterschiedlich sind (könnte das ein Problem darstellen?).

Ich werde jetzt mal versuchen, anstatt die ganze Gruppe 'Aufheizkurve' auszulesen und anschließend meine gewünschten Kanäle zu wählen, direkt nur meine Kanäle einzeln auszulesen...

Sonst noch Ideen?


RE: Messkurven aus TDMS auslesen - Nicht genügend Speicher zum Abschließen der Operation - schrotti - 19.11.2011 13:39

Das Wait hat nur insofern Einfluss auf den Speicherverbrauch, als das er mit höherer Wartezeit langsamerer belegt wird. Big Grin Das Wait kannst du guten Gewissens weglassen.

Dein Problem ist eigentlich ganz simpel: Du lädst zu viele Daten von der HD in den RAM. Die Lösung ist kann da wesentlich schwieriger sein. Der von dir genannte Ansatz, nur das zu lesen, was später auch gebraucht wird, ist hierbei der beste und einfachste Weg. Langt auch das nicht, bleiben noch zwei Möglichkeiten:
1. Wenn du den alle Kanäle gleichzeitig in einem Graph anzeigen willst, musst du erst einen angemessen Ausschnitt des Kanals lesen (Offset und Länge) und komprimieren. Anschließend das ganze wiederholen, bis der komplette Kanal gelesen wurde. Dabei geht natürlich Information durch das Komprimieren verloren.
2.Wenn dich das stört, dann wirst du nicht alle Dateien komplett und gleichzeitig öffnen können, sondern musst dich auf einen Ausschnitt beschränken, der von deinem Rechner bzw. von LV bewältigt werden kann.

Ansonsten schließe ich mich Der_Elch an. Die Sampleanzahl ist als Eigenschaft mittels des Schlüssels NI_ChannelLength abrufbar.


RE: Messkurven aus TDMS auslesen - Nicht genügend Speicher zum Abschließen der Operation - Der_Elch - 19.11.2011 14:22

(19.11.2011 13:02 )jeannyLab schrieb:  Danke Euch für die schnelle Hilfe!

Also das Einfügen einer Wait-Time hat leider nichts genützt, auch nicht bei 300 ms.

Die CPU-Auslastung liegt nur bei etwa 25 - 30 %, allerdings wird fast mein gesamter 2 GB Arbeitsspeicher 'aufgefressen'. Interessanterweise braucht Labview auch immer noch über 1 GB Arbeitsspeicher, wenn ich das VI gestoppt habe. Erst wenn ich das VI neu starte, kommt er runter.

Ich weißt ja vor dem Schleifenstart nicht genau, wie groß mein Array sein wird, da das von der Anzahl der Messpunkte jeder TDMS-Datei abhängt und die auch in den verschiedenen TDMS-Dateien etwas unterschiedlich sind (könnte das ein Problem darstellen?).

Ich werde jetzt mal versuchen, anstatt die ganze Gruppe 'Aufheizkurve' auszulesen und anschließend meine gewünschten Kanäle zu wählen, direkt nur meine Kanäle einzeln auszulesen...

Sonst noch Ideen?
Das wait kannst du getrost vergessen, da der Rechner ja nicht "überlastet" wird, sondern "nur" den RAM anfüllt.
Zu den 2GB Arbeitsspeicher: Da ich annehme das du eine 32Bit LV hast, ist das schon ein Problem. Denn mit 32 Bit System sind nur 2GB Arbeitsspeicher pro Programm möglich.

Schau dir mal deine Messdaten an, sind wirklich alle Messpunkte von Bedeutung? Vielleicht kannst du sie ja zusammenfassen (Mittelwertbildung über x Messwerte). Das mit dem Offset von schrotti klingt auch nacher einer sehr guten Idee.

Bzw vielleicht kannst du uns ein Bild vom FP geben oder genauer erklären was du anzeigen willst?


RE: Messkurven aus TDMS auslesen - Nicht genügend Speicher zum Abschließen der Operation - jeannyLab - 19.11.2011 20:31

Also das mit dem Lesen der einzelnen Kurven hat leider auch nichts gebracht.

Ich hab's nun auch an einem PC mit 4 GB Arbeitsspeicher probiert - dort läufts.

Messpunkte 'verlieren' ist keine Option.
Was ich mit den Messkurven machen will ist prinzipiell folgendes:
Ich habe mehrere TDMS-Dateien mit den 'selben' Messkurven - um eine statistisch korrekte Auswertung machen zu können. Also werde ich jeweils die Punkte der selben Messkurve aller TDMS-Dateien mitteln (und an bstimmten Punkten Streuwerte ermitteln etc.).
Anschließend möchte ich zwei verschiedene Messkurven gegeneinander darstellen. Daraus entsteht eine Art 'Punktewolke', die ich mittels Kurvenanpassung approximiere und somit schlussendlich aus den vielen Kurven eine schöne xy-Kurve erhalte (mit statistischen Aussagen zur Standardabweichung etc.).

Die Lösung mit dem stückweisen Auslesen der Kurven aus den TDMS-Dateien wäre also eine mögliche Lösung: Ich könnte ein Stück aller Messkurven aus allen TDMS-Dateien auslesen, mitteln und dann das nächste Stück auslesen und die gemittelten Werte an die vorigen anhängen... Etwas kompliziert, aber eine gute Idee - DANKESCHÖN (ich werde die Notwendigkeit mit meinem Betreuer vorerst besprechen).

Ich wollte auch noch die Initialisierung des Arrays ausprobieren. Allerdings hänge ich da fest, da er mir in dem 3-dimensionalen Array immer nur die n-1 te Seite des initialisierten Arrays mit den richtigen Werten ersetzt - seht ihr den Fehler (JPEG hängt an)??


RE: Messkurven aus TDMS auslesen - Nicht genügend Speicher zum Abschließen der Operation - jeannyLab - 20.11.2011 19:59

Ich bin langsam am verzweifeln... so lange schiebe ich schon die Blöcke durch die Gegend.
kann mir keiner von Euch helfen, wieso nur im letzten Schleifendurchgang das initialisierte Array ersetzt wird?


RE: Messkurven aus TDMS auslesen - Nicht genügend Speicher zum Abschließen der Operation - jeannyLab - 20.11.2011 20:56

Okay, das mit der Array-Initialisierung hat nun geklappt, aber bezüglich der Speicherproblematik auch nicht geholfen.


RE: Messkurven aus TDMS auslesen - Nicht genügend Speicher zum Abschließen der Operation - schrotti - 20.11.2011 23:20

Dass dein Speicherproblem durch das initialisierte Array gelöst wird war auch nicht zu erwarten, aber bei solchen Ungetümen ist wird es sicherlich etwas dazu beitragen. Du könntest es jetzt noch optimieren, indem du jedem Kanal ein eindimensionales Array initialisierst, das exakt dessen Größe entspricht und dieses Array in ein Cluster packst. Ansonsten habe ich dir mal ein kleines Beispiel zusammengeklickt. Viel Spaß