LabVIEWForum.de - Zu langsames schreiben in Datei: Daten vor Schreiben in Datei "zwischenspeichern" ?

LabVIEWForum.de

Normale Version: Zu langsames schreiben in Datei: Daten vor Schreiben in Datei "zwischenspeichern" ?
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,

ich habe einen While-Loop und während eines Durchlaufs werden zu unterschiedlichen Zeiten drei Unterschiedliche Werte berechnet.

Jetzt würde ich gerne alle diese Werte mit dem jeweiligen Zeitpunkt an dem der jeweilige Wert ermittelt wurde in eine Datei speichern. Speichern kann ich die Werte mit dem "Write to Spreadsheed-File.vi" welches bei jedem Durchlauf den Wert in eine Datei schreibt, bzw. den anderen Werten in der Datei anhängt.
Das Problem ist nun, dass dieser Speichervorgang scheinbar einige ms dauert (die Datei muss wahrscheinlich ja immer wieder geöffnet und wieder geschlossen werden). Und selbst diese wenigen ms bremsten mein System aus!

Ich frage mich nun, ob es nicht irgendwie die Möglichkeit gibt, alle Werte im Speicher irgendwie zu zwischen-speichern, und erst zum Ende wird dann alles in eine Datei geschrieben?

Da ich die Datenermittlung ein- und wieder ausschalten will, kann ich denke ich nicht die Index-Funktion des While Loopes benutzen.

Gibt es vielleicht eine andere Möglichkeit die Werte möglichst schnell zwischen zu speichern und sie dann am Ende abzuspeichern? Oder hat jemand eine andere Idee?

Viele Grüße
Hallo Sternhagel,

Ideen:
- Producer-Consumer-Schema: Parallele Schleifen
- Queues nutzen
- Beispiele dazu in der LabVIEW-Hilfe anschauen

Zitat:ob es nicht irgendwie die Möglichkeit gibt, alle Werte im Speicher irgendwie zu zwischen-speichern, und erst zum Ende wird dann alles in eine Datei geschrieben?
Abhängig von der Datenmenge ist das eine eher schlechte Idee. Was passiert mit deinen Daten, wenn das Programm aufgrund Speichermangels abstürzt?
Naja wegen Speichermangel abstürzen sollte, dann wäre das auch nicht so schlimm. Dann muss ich die Messung halt etwas anpassen, damit nicht so viele Daten ausgelesen werden. Also das wäre nicht das Problem.

Na ich versuche es dann mal mit Queues. Ich hatte eigentlich gehofft, dass es da eine einfachere Lösung gibt :-)

Vielen Dank!
Der einfachste Methode, die Werte zwischenzuspeichern, wäre die Indexierung des Ausgangs der For-Schleife. Wenn man sie verläßt, hat man das Array aller erzeugten Werte.

Zu Speicherzeit ist zu sagen, daß das "Write to Spreadshett" File so etwas wie eine eierlegende Wollmilchsau ist, vergleichbar mit einem Express-VI. U.a muß man sich nicht um Öffnen und Schließen kümmern, das macht bei jedem Zugriff das VI. Entsprechend langsam ist es dann.

Bessser ist, das Öffnen, Schließen der File und die Konvertierung der Daten in Text selbst zu besorgen und diesen reinen Text dann "In Textdatei speichern"

Beispiel:
[attachment=37309]
Hallo zusammen,

Wie ihr in der Angehängten Skizze sehen könnt, habe ich es nun folgendermaßen "gelöst":

Bei jedem Durchlauf wird eine neue Zeile in der Matrix hinzugefügt. Ich habe es nun noch nicht auf Geschwindigkeit getestet (das mache ich wohl erst Mittwoch), aber eigentlich sollte das so doch super schnell gehen, da erst ganz zum Schluss die Werte in die Datei gespeichert werden!

Was micht noch stört ist, dass ich zwei Mal die Matrix transponieren muss! Kann ich das irgendwie umgehen?

Viele Grüße
Hallo Sternhagel,

ganz allgemein zu deiner "Skizze":
Du willst ganz sicher nicht mit Matrizen arbeiten - was du brauchst, sind Arrays!

Zitat:Was micht noch stört ist, dass ich zwei Mal die Matrix transponieren muss! Kann ich das irgendwie umgehen?
Wurde doch schon gesagt: Autoindizierung am Schleifentunnel nutzen! Wenn du das Gefühl hast, in der erzeugten Datei wären Spalten/Zeilen vertauscht, kannst du direkt beim Speichern transponieren. (Einfach mal die Kontexthilfe zur Funktion lesen!)
Ok ich habe deinen Rat beherzigt und das ganze mit Arrays realisiert. Und jetzt muss ich das ganze auch nicht mehr transponieren :-) (Siehe Anhang)

Aber was ist den grundsätzlich das Problem an Matrizen im Vergleich zu Arrays?

Die Indexfunktion wie vorgeschlagen möchte ich nicht benutzen, da ich die Datenaufnahme ein- und ausschalten möchte und ich wüsste nicht, wie ich das mit der Indexfunktion realisieren könnte.
In meiner Version im Anhang ist das hingegen ganz einfach zu lösen, einfach durch eine zusätzliche Case-Structure.
Hallo Sternhagel,

Matrizen sind für mathematische Berechnungen gedacht. Aufgrund der Polymorphie funktionieren auch viele andere Funktionen mit diesem Datentyp - was aber nicht heißt, dass das immer problemlos läuft (es wurden Programmabstürze berichtet, der rote Punkt weist außerdem auf Datentyp-Konvertierungen hin).

Wenn du einfach nur Daten sammeln willst, nimmt man dafür üblicherweise (auch in anderen Programmiersprachen) Arrays...
Referenz-URLs