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!
Ich speichere eine Menge Daten kontinuierlich in ein TDMS file. Sprich bis zu 35 Messdaten und das alle 0,5 sek. Und ca 100 Messdaten alle 20 sek.
Über die Zeitdifferenz vor dem Schreiben und danach sehe ich, dass nach und nach der Vorgang immer langsamer wird.
Nach dem starten des Aufzeichnens benötigt das VI ca. 10-20 ms. Nach 1 Stunde sind es schon um die 650ms und ist 25MB groß. Man kann dirket zuschaun wie der Zeitbedarf fürs schreiben länger wird.
Was kann ich tun? Habe ich da ein Speicherleck oder sind das zuviele Speicherzugriffe / Daten??
(Das Programm habe ich aus einem großen VI rauskopiert, leider wird alles irgendwo eingefügt von LabVIEW, es geht aber nur um das Blockdiagram und die TDMS dlls.)
Eine TimedLoop is alle 500ms die andere alle 20sek.
Zitat:Ich speichere eine Menge Daten kontinuierlich in ein TDMS file. Sprich bis zu 35 Messdaten und das alle 0,5 sek. Und ca 100 Messdaten alle 20 sek.
Und wo kommen hier eine "Menge Daten" vor?
Zitat:Über die Zeitdifferenz vor dem Schreiben und danach sehe ich, dass nach und nach der Vorgang immer langsamer wird.
Ohne dein VI anschauen zu können: irgendwo ein BuildArray, welches ein immer größer werdendes Array erzeugt?
Das sind doch ne Menge Daten, und werden nach jedem schreiben auf das TDMS file immer mehr. Die müssen doch beim nächsten mal schreiben verwaltet werden?!?
also 70 Messwerte pro Sekunde sind nun nicht wirklich "eine Menge Daten"...
Zu den Scrennshots:
- Mir ist nicht wirklich klar, warum man so viele lokale Variablen nutzen muss.
- Mir ist nicht wirklich klar, warum man ein 1D-Array so kompliziert in ein 2D-Array wandeln muss, damit man dann 1D-Array in TMDS speichern kann.
Zitat:Was meinst du mit Array schreiben?
Man sieht leider nicht, wo z.B. diese lokalen Variablen mit 1D-Arrays befüllt werden. Man sieht nicht, wie die Arrays zusammengesetzt werden. Man sieht nicht, ob du irgendwo eine Schleife mit einem uninitialisierten Schieberegister (und Arrays darin) verwendest...
Um dir effektiv helfen zu können, bitten wir dich, dein VI hochzuladen. Wenn es "geheime" Dinge enthält, dann lösche sie vorher raus; es ist meist immer noch besser ein nicht funktionierendes VI zu sehen, als ein paar Screenshots.
(04.07.2013 12:28 )GerdW schrieb: - Mir ist nicht wirklich klar, warum man so viele lokale Variablen nutzen muss.
- Mir ist nicht wirklich klar, warum man ein 1D-Array so kompliziert in ein 2D-Array wandeln muss, damit man dann 1D-Array in TMDS speichern kann.
zu 1: Ich hab so viele Controls und Indicator die ich an anderen Stellen schon benötige. Und wenn ich die vom Ursprung hier hin "verdrahte", dann verliert man den Überblick bei so vielen Linien.
zu 2: Weil ichs nur so geschaft hab, dass die Daten ins TDMS geschrieben werden. Vielleicht kannst mir sagen wie man das anstellt?
Ich hab nur eine Group Name und und darin sind alle Daten in unterschiedlichen Channels.
Zitat:Man sieht leider nicht, wo z.B. diese lokalen Variablen mit 1D-Arrays befüllt werden. Man sieht nicht, wie die Arrays zusammengesetzt werden. Man sieht nicht, ob du irgendwo eine Schleife mit einem uninitialisierten Schieberegister (und Arrays darin) verwendest...
Die Arrays werden durch For-Schleifen erstellt. Schieberegister habe ich keine...
Also dass hilft alles nichts, selbst wenn ich die Beispiele von NI verwende..
Wenn ich das VI kontinuierlich durchlaufen lasse und die TDMS file öffne, schreibe, und wieder schließe, wird das von Zeit zu Zeit langsamer.
Ich brauch jemanden der sich mit TDMS auskennt und selbst kontinuierlich Daten abspeichert und das am besten mit TDMS ADVANCED OPEN, SYNCHRON oder ASYNCHRON...
Hoffe es meldet sich jemand...
Bin am verzweifeln
05.07.2013, 09:02 (Dieser Beitrag wurde zuletzt bearbeitet: 05.07.2013 09:11 von GerdW.)
1.) Quick&Dirty-Lösung: lagere die Speicherung in eine parallele Schleife aus und transferiere die zu speichernden Daten per Queue zu dieser Schleife. Dies ist der Standardansatz, um eine Datenerfassungsschleife von allen bremsenden Einflüssen zu entkoppeln...
2.) Profil ergänzen nicht vergessen...
3.) Zu meiner Anmerkung zu den unnötigen Array-Operationen:
4.) Wenn man dann sieht, wieviele einzelne Daten du in in die TMDS-Datei schreibst: kann man die nicht etwas besser zusammenfassen? Erst wird ein 1D-Array zeilenweise geschrieben, dann das nächste. Warum nicht beide zu einem 2D-Array zusammenfassen? Usw. usf.
[quote]4.) Wenn man dann sieht, wieviele einzelne Daten du in in die TMDS-Datei schreibst: kann man die nicht etwas besser zusammenfassen? Erst wird ein 1D-Array zeilenweise geschrieben, dann das nächste. Warum nicht beide zu einem 2D-Array zusammenfassen? Usw. usf. [\quote]
Ich will doch alle Messdaten in ein extra Channel schreiben?
Ich hab hier ein kleines VI was 12 mal Pseudowerte speichert.
Vll magst du das Programm mal 10 min laufen lassen, und siehst dabei auf die verstrichen Zeit "time".