hi, ich beschäftige mich gerade ein wenig mit im netz verfügbaren datalogger-scetches dabei fällt mir auf das alle im main-loop folgendes machen open file write file close file hat es irgendeinen sinn, dass file jedesmal auf und zu zu machen ??? ist es nicht besser das file zu öffnen, immer schön reinzuschreiben, eventuell mit einem flush dazu und das file erst beim beenden des log-vorgangs nach 5min oder 2h oder was auch immer zu schließen ???
Ray M. schrieb: > das file erst beim beenden des log-vorgangs nach 5min oder 2h > oder was auch immer zu schließen ??? Es macht Sinn, eine Datei immer möglichst zeitnah zu schließen! Im Falle eines ungewollten Abbruches ist eine geöffnete Datei meistens kaputt.
Gustl B. schrieb: > Dafür gibt es doch file.flush() oder? Nein flush sorgt nur dafür das die Daten im Cache (des OS) konsistent sind. Deswegen werden sie noch lange nicht auf die sd karte geschrieben. Je nach Betriebssystem bleiben die gerne erstmal im RAM und werden erst beim sync auf die Karte geschrieben
> hat es irgendeinen sinn, dass file jedesmal auf und zu zu machen ???
Ich vermute, die meisten (Sketch-Schreiber) haben einfach nur
irgendwelchen Beispielcode kopiert. Ob es wirklich notwendig oder
sinnvoll ist, darüber wird sich kaum einer Gedanken gemacht haben.
Andererseits: was ist der Vorteil, das File offen zu lassen? Perfomance
und geringe Anzahl von Schreibzugriffen. Falls beides irrelevant ist,
spricht nichts gegen ein open/write/close - dann muß man sich auch keine
Gedanken machen, wann man das File denn mal schließt/flushed.
foobar schrieb: > Ich vermute, die meisten (Sketch-Schreiber) haben einfach nur > irgendwelchen Beispielcode kopiert. Ob es wirklich notwendig oder > sinnvoll ist, darüber wird sich kaum einer Gedanken gemacht haben. Spätestens in dem Augenblick, wenn die Spannungsversorgung ausfällt und das File ist in diesem Augenblick noch offen, machst du dir Gedanken, wie man es anders machen könnte :-)
Beim FAT Filesystem steht die Größe der Datei im Inhaltsverzeichnis. Wenn das nicht aktualisiert wurde und der Rechner abstürzt, werden bei der späteren Reparatur des Dateisystems alle darüber hinaus gehenden Daten verworfen. Übrig bleibt also nur das, was beim letzten Aktualisieren des Inhaltsverzeichnisses drin war.
Timmo H. schrieb: > Gustl B. schrieb: >> Dafür gibt es doch file.flush() oder? > Nein flush sorgt nur dafür das die Daten im Cache (des OS) konsistent > sind. Deswegen werden sie noch lange nicht auf die sd karte geschrieben. > Je nach Betriebssystem bleiben die gerne erstmal im RAM und werden erst > beim sync auf die Karte geschrieben Komisch. Ich verwende das in Python und ohne werden die Daten nur sehr selten auf Platte geschrieben, mit dem flush ziemlich oft. Warum das so ist weiß ich auch nicht.
Gustl B. schrieb: > Timmo H. schrieb: >> Gustl B. schrieb: >>> Dafür gibt es doch file.flush() oder? >> Nein flush sorgt nur dafür das die Daten im Cache (des OS) konsistent >> sind. Deswegen werden sie noch lange nicht auf die sd karte geschrieben. >> Je nach Betriebssystem bleiben die gerne erstmal im RAM und werden erst >> beim sync auf die Karte geschrieben > > Komisch. Ich verwende das in Python und ohne werden die Daten nur sehr > selten auf Platte geschrieben, mit dem flush ziemlich oft. Warum das so > ist weiß ich auch nicht. Woran erkennst du denn, dass deine Daten wirklich auf der Festplatte landen und nicht nur im Cache? Und woran erkennst du, dass auch der Verzeichniseintrag auf der Festplatte angepasst wurde?
Ob ein Datenverlust bei Spannungsausfall auftritt hat erstmal nichts mit dem Aufruf von close/flush zu tun - es kommt auf die Implementation an. Der OP erwähnte Sketche, also wahrscheinlich Arduino, und da kocht jeder sein eigenes Süppchen. Da über Posix/Windows-Eigenschaften zu spekulieren, ist sinnlos. Der write könnte z.B. wegen RAM-Mangels direkt auf's Medium schreiben und der close ist nen NOP. Um das zu wissen, schaut man sich (falls vorhanden) die Doku an oder halt den Sourcecode selbst. Und wenn es wirklich wichtig ist, öffnet man die "Can of Worms" und macht sich z.B. Gedanken, in welcher Reihenfolge die Blöcke geschrieben werden, wie das Speichermedium mit einem Stromausfall klarkommt, ... PS: Auf einem Posix-System reicht ein flush um einen Datenverlust beim beenden des Programms zu verhindern. Gegen Datenverlust bei Stromausfall muß man mehr Aufwand treiben - ein simples close reicht da nicht (s. u.A. fsync/fdatasync oder O_SYNC/O_DIRECT).
Rolf M. schrieb: > Woran erkennst du denn, dass deine Daten wirklich auf der Festplatte > landen und nicht nur im Cache? Und woran erkennst du, dass auch der > Verzeichniseintrag auf der Festplatte angepasst wurde? An der Dateigröße die mir ls -l ausspuckt. Aber du hast wohl Recht, ein flush() alleine reicht nicht immer.
Gustl B. schrieb: > Aber du hast wohl Recht, ein > flush() alleine reicht nicht immer. ...und foobar hat auch Recht. Es kommt darauf an, wie das Filesystem mit der Platte umgeht. Windows ist anders als Linux. Und das wiederum ist anders als ein auf einem Controller implementiertes Filesystem.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.