Forum: Mikrocontroller und Digitale Elektronik daten auf sd, grundsatzfrage


von Ray M. (ray_m)


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 ???

von Manfred (Gast)


Lesenswert?

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.

von Gustl B. (-gb-)


Lesenswert?

Dafür gibt es doch file.flush() oder?

von Timmo H. (masterfx)


Lesenswert?

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

von foobar (Gast)


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.

von Cora (Gast)


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 :-)

von Stefan F. (Gast)


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.

von Gustl B. (-gb-)


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.

von Rolf M. (rmagnus)


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?

von foobar (Gast)


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).

von Gustl B. (-gb-)


Lesenswert?

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.

von Cora (Gast)


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.

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
Noch kein Account? Hier anmelden.