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?fsync
ist für die Atomizität notwendig. Sie können nicht erwarten, eine Datei zu schließen, sie erneut zu öffnen und Ihren Inhalt ohne einefsync
in der Mitte zu finden. Es funktioniert oft, aber nicht unter Linux mit ext4 und Standard-Mount-Optionen. Esfsync
ist auch nicht garantiert, dass das Bügeleisen auf den Platten wirklich magnetisch umgedreht wird, da 1: fsync deaktiviert werden kann (im Laptop-Modus) und 2: die interne Pufferung der Festplatte möglicherweise nicht zum Spülen angewiesen wird.Weil das Betriebssystem dies möglicherweise nicht tut. Durch den Flush-Vorgang werden die Dateidaten in den Dateicache im RAM verschoben, und von dort aus muss das Betriebssystem sie tatsächlich an die Festplatte senden.
quelle
actually
hier relativ: Wenn auf dem Zielgerät das Schreib-Caching aktiviert ist, haben die Daten bei deros.fsync()
Rückgabe möglicherweise nicht die tatsächlichen Platten / Chips erreicht .Es löscht den internen Puffer, der das Betriebssystem veranlassen soll, den Puffer in die Datei zu schreiben. [1] Python verwendet die Standardpufferung des Betriebssystems, sofern Sie dies nicht anders konfigurieren.
Aber manchmal entscheidet sich das Betriebssystem immer noch dafür, nicht zusammenzuarbeiten. Besonders bei wunderbaren Dingen wie Schreibverzögerungen in Windows / NTFS. Grundsätzlich wird der interne Puffer geleert, aber der Betriebssystempuffer hält ihn immer noch fest.
os.fsync()
In diesen Fällen müssen Sie das Betriebssystem anweisen, es auf die Festplatte zu schreiben .[1] http://docs.python.org/library/stdtypes.html
quelle
Grundsätzlich bereinigt Flush () Ihren RAM-Puffer. Seine eigentliche Stärke besteht darin, dass Sie danach weiter darauf schreiben können - aber es sollte nicht als die beste / sicherste Funktion zum Schreiben in eine Datei angesehen werden. Es spült Ihren RAM, damit mehr Daten kommen, das ist alles. Wenn Sie sicherstellen möchten, dass Daten sicher in die Datei geschrieben werden, verwenden Sie stattdessen close ().
quelle