daten auf sd, grundsatzfrage

OP #5524768
Lesenswert?

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 ???
Gast #5524962
Lesenswert?

> 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.
Gast #5525064
Lesenswert?

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 :-)
Gast #5525174
Lesenswert?

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.
#5525248
Lesenswert?

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.
#5525623
Lesenswert?

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?
Gast #5525644
Lesenswert?

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).
Gast #5525660
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren