web-dev-qa-db-ger.com

was genau macht das File.flush () des Pythons?

Ich habe dies in der Python Dokumentation für Dateiobjekte gefunden:

bei Flush () werden die Daten der Datei nicht unbedingt auf die Festplatte geschrieben. Verwenden Sie flush () gefolgt von os.fsync (), um dieses Verhalten sicherzustellen.

Meine Frage ist also: Was genau macht Pythons flush? Ich dachte, dass es zwingt, Daten auf die Festplatte zu schreiben, aber jetzt sehe ich, dass dies nicht der Fall ist. Warum? 

120
geek

In der Regel sind zwei Pufferebenen beteiligt:

  1. Interne Puffer
  2. Betriebssystempuffer

Die internen Puffer sind Puffer, die von der Laufzeit/Bibliothek/Sprache erstellt werden, mit der Sie programmieren. Sie sollen die Dinge beschleunigen, indem Systemaufrufe für jeden Schreibvorgang vermieden werden. Wenn Sie stattdessen in ein Dateiobjekt schreiben, schreiben Sie in dessen Puffer, und wenn der Puffer voll ist, werden die Daten mithilfe von Systemaufrufen in die eigentliche Datei geschrieben.

Aufgrund der Puffer des Betriebssystems bedeutet dies jedoch möglicherweise nicht, dass die Daten geschrieben werden auf die Festplatte. 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) in den Puffer gelangt und die Stromversorgung Ihres Computers unterbrochen wird, befinden sich diese Daten beim Ausschalten des Computers nicht auf der Festplatte.

Um Ihnen dabei zu helfen, haben Sie die Methoden flush und fsync für ihre jeweiligen Objekte.

Das erste, flush, schreibt einfach alle Daten, die in einem Programmpuffer verweilen, in die eigentliche Datei. In der Regel bedeutet dies, dass die Daten aus dem Programmpuffer in den Betriebssystempuffer kopiert werden.

Konkret bedeutet dies, 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 werden, für die sie vorgesehen sind. Mit anderen Worten, diese Methode kopiert Daten von den Betriebssystempuffern auf die Festplatte.

Normalerweise müssen Sie sich nicht mit beiden Methoden befassen, aber wenn Sie sich in einem Szenario befinden, in dem Paranoia über das, 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 viel häufiger sind als 2013, sodass jetzt noch mehr Caching- und Pufferebenen erforderlich sind. Ich nehme an diese Puffer werden auch von den Sync/Flush-Aufrufen behandelt, aber ich weiß es nicht wirklich.

Weil das Betriebssystem dies möglicherweise nicht tut. Die Flush-Operation zwingt die Dateidaten in den Dateicache im RAM, und von dort ist es die Aufgabe des Betriebssystems, sie tatsächlich auf die Festplatte zu senden.

Dadurch wird der interne Puffer geleert, wodurch das Betriebssystem den Puffer in die Datei schreiben soll. [1] Python verwendet die Standardpufferung des Betriebssystems, sofern Sie dies nicht anders konfigurieren.

Aber manchmal entscheidet das OS immer noch nicht zu kooperieren. Besonders bei wunderbaren Dingen wie Schreibverzögerungen unter Windows/NTFS. Grundsätzlich wird der interne Puffer geleert, aber der OS-Puffer hält daran fest. In diesem Fall müssen Sie dem Betriebssystem mitteilen, dass es mit os.fsync() auf die Festplatte geschrieben werden soll.

[1] http://docs.python.org/library/stdtypes.html

6
Dan

Im Grunde reinigt flush () Ihren RAM -Puffer. Die eigentliche Fähigkeit besteht darin, dass Sie danach weiter schreiben können - aber es sollte nicht als das beste/sicherste Feature zum Schreiben in Dateien betrachtet werden. Es wird Ihr RAM geleert, damit noch mehr Daten kommen, das ist alles. Wenn Sie sicherstellen möchten, dass Daten sicher in eine Datei geschrieben werden, verwenden Sie stattdessen close (). 

0
zA.