1. ホーム
  2. python

[解決済み] file.flush()はいったい何をしているのですか?

2022-04-25 03:21:11

質問

Pythonの中にこんなものがありました。 ファイルオブジェクトのドキュメント :

flush() は、必ずしもファイルのデータをディスクに書き込むとは限りません。使用方法 flush() に続いて os.fsync() を使用すると、この動作を確実に行うことができます。

そこで質問なのですが、Pythonの flush は何をしているのでしょうか?私は、それが強制的にデータをディスクに書き込むと思っていたのですが、今はそうではないことがわかります。なぜでしょうか?

解決方法は?

通常、2段階のバッファリングが行われます。

  1. 内部バッファ
  2. オペレーティングシステムバッファ

内部バッファは、プログラミングを行うランタイム/ライブラリ/言語によって作成されるバッファで、書き込みのたびにシステムコールを行わないようにすることで、高速化を図るものです。その代わり、ファイルオブジェクトに書き込むときはそのバッファに書き込み、バッファがいっぱいになるたびに、システムコールを使って実際のファイルにデータを書き込む。

しかし、OSのバッファの関係で、この場合、データが書き込まれるのは ディスクへ . ランタイムが保持するバッファからオペレーティングシステムが保持するバッファにデータがコピーされることを意味するだけかもしれません。

何かを書いて、それがバッファ(だけ)になってしまい、マシンの電源が切れると、そのデータはディスク上にない。

そこで、それを支援するために flushfsync メソッドをそれぞれのオブジェクトに追加します。

1つ目は flush は、プログラムバッファに残っているデータを実際のファイルに書き出すだけです。一般的に、これはデータがプログラム・バッファからオペレーティング・システム・バッファにコピーされることを意味します。

具体的には、他のプロセスが同じファイルを読み込むために開いている場合、ファイルに流したばかりのデータにアクセスできるようになるということです。しかし、これは必ずしもデータがディスクに永久に保存されたことを意味するものではありません。

そのためには os.fsync このメソッドは、すべてのオペレーティング・システム・バッファが、その対象となるストレージ・デバイスと同期していることを保証します。

通常、どちらのメソッドも使用する必要はありませんが、実際にディスクに保存される内容についてのパラノイアが良いことであるシナリオにいる場合、指示通りに両方の呼び出しを行う必要があります。


2018年追記

キャッシュ機構を持つディスクは2013年当時よりもはるかに一般的になっており、現在はさらに多くのレベルのキャッシュとバッファが関係していることに注意してください。I とする これらのバッファもsync/flushの呼び出しで処理されますが、実際のところはわかりません。