![]() |
kontinuierlichen Messdaten speichern
Ich habe momentan ein Projekt, wo ich Temperaturfühler auslese und diese Messdaten speichern soll.
Die Messung kann bis zu einer Woche gehen, was heißt dass jede Menge Daten zusammen kommen. Es soll jede Sekunde der Temperaturwert (als double) und die aktuelle Zeit (auch double) gespeichert werden. Wie wäre es am geschicktesten das umzusetzen? Sollte jeder Wert sofort in eine Datei geschrieben werden, oder lieber immer Gruppenweise, wie zum Beispiel einmal in der Minute. Macht man das mit einem Filestream? Ich habe gehört, dass die Daten wenn sie binär gespeichert werden weniger Platz verbrauchen. Wie muss ich dafür vorgehen. Ist es am besten jedes Wertepaar als Record zu behandeln? So Vielen dank schon mal an euch im Vorraus :-D |
Re: kontinuierlichen Messdaten speichern
Wenn du die Sache mit der Datenbank ausgeschlossen hast, dann würde ich in Blöcken schreiben. Damit verlierst du bei einem Systemabsturz nicht alle Daten.
Was heist denn binär für dich? Ein Double belegt immer 8 Byte. Und so speicherst du die auch. Ob du das jetzt in einen Record packst, bringt (je nach Anwendung) keinen Vor- und Nachteil im Platzverbrauch. Es könnte nur für dich leichter in der Programmierung werden. Ich würde mir aber nochmal Gedanken über die Messgenauigkeit machen. Wahrscheinlich kannst du sowieso auf Single gehen. Das wären dann nur 4 Bytes. Auch gesehen habe ich schon Festkommawerte (mit 2 Kommastellen; ähnlich wie Currency). Wenn du weiterhin sparen willst, kannst du dir ja mal Gedanken über den Zeitstempel machen. Entweder du speicherst nur am Anfang einmal die Zeit und weist dann einfach, dass jeder Wert entsprechend eine Sekunde später ist, oder du speicherst die ZeitDifferenz zum vorherigen Messwert, oder, oder oder.... du kannst dir in deinem Datenformat so einiges überlegen. Das hängt aber auch von deiner Technik und deinen Anfforderungsgenauigkeiten ab. Etwas anderes ist es, wenn du die Messwerte später in Notepad (oder auch Excel) lesen willst. Dann mach dir mal keine Gedanken über Speicherplatzeinsparung, sondern eher über das notwendige Datenformat. Da musst du auch meistens die Zahlen in Text umwandeln, was je nach Länge der Zahlen (in Textformat) entspr. Bytes benötigt. |
Re: kontinuierlichen Messdaten speichern
Danke erstal für die ausführliche Antwort.
Mit Binär meinte ich, dass es nicht im Klartext gespeichert wird. Also dass man es eben nicht mit Notepad öffnen kann. Das mit der Zeit nur einmal am Anfang speichern, das finde ich gut, da die Abstände ja wirklich immer gleich sind. Auch würde single als Datentyp für die Temperaturwerte reichen. Das spart auch nochmal ordentlich. Jetzt würde ich gerne noch wissen wie ich das Programmiertechnisch am besten löse. Bisher habe ich in Delphi ausser ini Dateien noch nichts gespeichert. Mach ich das am besten mit einem TFilestream, dem ich dann jeden Messwert, bzw. jeden Block von Messwerten übergebe? |
Re: kontinuierlichen Messdaten speichern
Da Windows ja über eine nette Dateicache verfügt, kannst du eigentlich sofort die Werte in die Datei schreiben.
TFileStream und eigentlich fast alles andere geht da auch ganz gut. und wenn du möchtest, dann kannst du ja alle 15, 30 oder 60 Sekunden ein "Flush" (Dateipuffer leeren) ausführen. Wegen der Zeit: ich weiß ja nicht wie genau die Zeitbestimmung sein muß, aber wenn es schon genauer sein muß (die Timer und Windows arbeiten ja nicht soooo genau) ... eventuell wäre es da gut, wenn du zwischendurch nochmals die aktuelle Zeit mit einfließen läßt, dann verringern sich die Rechenungenauigkeiten.
Delphi-Quellcode:
z.B. viele Videoformate speichern nur den Unterschied zwischen folgebildern und fügen alle einer gewissen Zeit ein Vollbild in den Datenstrom mit ein, damit sich z.B. komprimierungsfehler nicht aufaddieren und man auch mal schön schnell in dem Film rumspringen muß, ohne gleich alle vom Dateianfang an durchgehn zu müssen.
[single] // x = INF // Signalwert für nachfolgende Zeit
[double] // aktuelle Zeit [single] // Temperatur [single] // Temperatur [single] // Temperatur [single] // Temperatur [single] // Temperatur ... [single] // x = INF // Signalwert für nachfolgende Zeit [double] // aktuelle Zeit [single] // Temperatur [single] // Temperatur [single] // Temperatur [single] // Temperatur ... |
Re: kontinuierlichen Messdaten speichern
Du kannst auch nochmal über Festkommawerte nachdenken. Unter Umständen kommst du dann auf 2 Bytes runter. Wenn du z.B. eine Genauigkeit von 2 Nachkommastellen haben willst, dann schaffst du damit einen Temperaturbereich von 0 bis 650 Kelvin. (wenn du z.B. eine 24533 abspeicherst, bedeutet dies 245.22) Festkommawerte entsprechen ja auch eher dem Verhalten von A/D-Wandlern.
TFileStream ist ganz einfach. (ungetestet)
Delphi-Quellcode:
Wahrscheinlich ist es güntstiger das Auslesen der Messwerte in einem Thread zu gestalten, damit du wirklich jede Sekunde lesen kannst, falls mal das Speichern (oder das GUI) etwas länger dauert.
const Dateiname='xyz.dat';
var Datei:TfileStream; ... if fileexists(Dateiname) then begin Datei:=Tfilestream.create(Dateiname,fmopenread); Datei.seek(0,sofromend); end else begin Datei:=Tfilestream.create(Dateiname,fmopenread); //Header schreiben, z.B. Datei.write(zeit,sizeof(zeit)); //zeit ist z.B. TDateTime end; try //Messwert schreiben Datei.write(Messwert,sizeof(Messwert); ... finally Datei.free; end; Edit: himitsus Variante wird auch von vielen Messgeräteherstellern genutzt. Du hast eben Blöcke, die am Anfang einen Zeitstempel und eine Länge haben. Dadurch kannst du auch nach einer Pause in derselben Datei weiterschreiben und einfach einen neuen Block anfangen. |
Re: kontinuierlichen Messdaten speichern
Der Datentyp für die Messwerte hängt davon ab, was und wie du messen willst. Wenn du nur deine Zimmertemperatur ohne Nachkommastelle hin messen willst, reicht die ein byte. Wenn du sehr genaue Messwerte hast, die im schlimmsten Fall noch groß streuen, brauchst du was größeres.
Wie sehen denn deine Messwerte aus? (In welchem Intervall und mit welcher Genauigkeit). Ich gehe fast davon aus, dass du auch schon mit einem word (2Byte: 0 bis 65535) auskommst. Du kannst dir ja eine einfache lineare Funktion basteln, die dann die Temperaturen auf dieses Intervall abbilden. Mit der Speicherung wäre mein Gedanke der, dass du eher viele kleine Dateien anlegst, jeweils vielleicht für 10min. An den Anfang kommt der Zeitstempel und dann die Werte. Das hat auch den Vorteil, dass du nicht immer die Riesendatei anfassen musst, wenn du nachschauen willst, wie warm es am Donnerstag um 12 war. Und falls was kaputt geht, verlierst du nur wenige Messwerte. |
Re: kontinuierlichen Messdaten speichern
Zitat:
Zitat:
Zitat:
|
Re: kontinuierlichen Messdaten speichern
Also meine Messwerte haben zwei Nachkommastellen, deshalb finde ich die Variante sie mit 100 zu multiplizieren sehr gut.
Dann komm ich wirklich mit 2 Byte aus. Mehrere Dateien finde ich allerdings nicht so praktisch, da jede Datei eine Messung darstellen soll. Die Zeiten jeweils in Intervallen abzuspeichern finde ich sehr clever das werde ich mir gleich mal genauer überlegen. |
Re: kontinuierlichen Messdaten speichern
nja groß ... bei dem Intervall und mit Singel für Temperatur so etwa 1,2 MB pro Woche.
da wäre die Mehrdateivariante alle 10 Minuten mit ~1300 Byte pro Datei schon reichlich Platzverschwendung (wann man den Platzverbrauch im Dateisystem betrachtet) |
Re: kontinuierlichen Messdaten speichern
Zitat:
das mit binär oder Text würde ich mir nochmal überlegen. Ich habe das zwar jahrzehntelang auch so gemacht, komme aber immer mehr davon ab. Binäre Dateien sind eben nicht offen lesbar (was das Debuggen erschwert), nicht reparierbar und können auch ohne die zugehörige Software überhaupt nicht gelesen werden. Daher geht der Trend in der IT ganz allgemein zu lesbaren Protokollen (FTP,HTTP) und lesbaren Dateien (XML). Eine XML-formatierte Datei mit Messwerten ist auch noch lesbar, wenn deine Software längst untergegangen ist. Ich weiss natürlich nicht, ob du das überhaupt willst, aber meiner Meinung nach ist Verschleierung von Daten nicht Aufgabe eines Programmierers, im Gegenteil. Meine Kunden dürfen meine Dateien gerne auch noch lesen, wenn ich tot bin. Ich weiss aber, dass nicht jeder Programmierer so denkt. Die Datenmenge kannst du ja nachrechenen, lohnt sich aber nicht: je Sekunde 2 Doubles geben nicht mal 2 MByte am Tag. Eine durchschnittliche heutige Festplatte reicht also ein paar Jahre. Ich würde wegen der leichteren Handhabung Monatsdateien anlegen. Gruss Reinhard |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz