Es gibt normalerweise zwei Pufferebenen:
- Interne Puffer
- Betriebssystempuffer
Die internen Puffer sind Puffer, die von der Laufzeit / Bibliothek / Sprache erstellt werden, für die Sie programmieren, und sollen die Dinge beschleunigen, indem Systemaufrufe bei jedem Schreibvorgang vermieden werden. Wenn Sie in ein Dateiobjekt schreiben, schreiben Sie stattdessen in dessen Puffer. Wenn der Puffer voll ist, werden die Daten mithilfe von Systemaufrufen in die eigentliche Datei geschrieben.
Aufgrund der Betriebssystempuffer bedeutet dies jedoch möglicherweise nicht, dass die Daten auf die Festplatte geschrieben werden . Dies kann nur bedeuten, dass die Daten aus den von Ihrer Laufzeit verwalteten Puffern in die vom Betriebssystem verwalteten Puffer kopiert werden.
Wenn Sie etwas schreiben und es (nur) im Puffer landet und die Stromversorgung Ihres Computers unterbrochen wird, befinden sich diese Daten beim Ausschalten des Computers nicht auf der Festplatte.
Also, um zu helfen mit , dass Sie die flush
und fsync
Methoden, auf ihre jeweiligen Objekte.
Die erste flush
Methode schreibt einfach alle Daten, die in einem Programmpuffer verbleiben, in die eigentliche Datei. In der Regel bedeutet dies, dass die Daten aus dem Programmpuffer in den Betriebssystempuffer kopiert werden.
Dies bedeutet insbesondere, dass ein anderer Prozess, der dieselbe Datei zum Lesen geöffnet hat, auf die Daten zugreifen kann, die Sie gerade in die Datei geschrieben haben. Dies bedeutet jedoch nicht unbedingt, dass es "dauerhaft" auf der Festplatte gespeichert wurde.
Dazu müssen Sie die os.fsync
Methode aufrufen , mit der sichergestellt wird, dass alle Betriebssystempuffer mit den Speichergeräten synchronisiert sind, für die sie bestimmt sind. Mit anderen Worten, diese Methode kopiert Daten aus den Betriebssystempuffern auf die Festplatte.
Normalerweise müssen Sie sich nicht mit beiden Methoden beschäftigen, aber wenn Sie sich in einem Szenario befinden, in dem Paranoia darüber, was tatsächlich auf der Festplatte landet, eine gute Sache ist, sollten Sie beide Anrufe wie angewiesen tätigen.
Nachtrag im Jahr 2018.
Beachten Sie, dass Festplatten mit Cache-Mechanismen heute weitaus häufiger sind als 2013, sodass jetzt noch mehr Ebenen für Caching und Puffer beteiligt sind. Ich gehe davon aus, dass diese Puffer auch von den Sync / Flush-Aufrufen verarbeitet werden, aber ich weiß es nicht wirklich.
with file('blah') as fd: #dostuff
Konstrukt verwende, weiß ich, dass es das Schließen des Dateideskriptors garantiert. Spült oder synchronisiert es auch?