Pythonでこれを見つけたファイルオブジェクトのドキュメント:
flush()
ファイルのデータをディスクに書き込む必要はありませんflush()
。os.fsync()
この動作を確実にするためです。
そこで質問なのですが、Python は一体何をflush
しているのでしょうか? ディスクにデータを書き込むように強制していると思っていましたが、そうではないことがわかりました。なぜでしょうか?
ベストアンサー1
通常、バッファリングには 2 つのレベルがあります。
- 内部バッファ
- オペレーティング システム バッファ
内部バッファは、プログラミング対象のランタイム/ライブラリ/言語によって作成されるバッファであり、書き込みのたびにシステム コールを回避することで処理を高速化することを目的としています。代わりに、ファイル オブジェクトに書き込むときはそのバッファに書き込み、バッファがいっぱいになると、システム コールを使用して実際のファイルにデータが書き込まれます。
ただし、オペレーティングシステムのバッファにより、データが書き込まれることを意味しない場合があります。ディスクにこれは、データがランタイムによって管理されるバッファーからオペレーティング システムによって管理されるバッファーにコピーされることを意味するだけかもしれません。
何かを書き込んでそれがバッファ(のみ)に保存され、マシンの電源が切断された場合、マシンの電源がオフになったときにそのデータはディスク上に存在しません。
そのため、これを支援するために、それぞれのオブジェクトにメソッドflush
とメソッドが用意されています。fsync
最初の はflush
、プログラム バッファに残っているデータを実際のファイルに書き出すだけです。通常、これはデータがプログラム バッファからオペレーティング システム バッファにコピーされることを意味します。
具体的には、別のプロセスが同じファイルを読み取り用に開いている場合、ファイルにフラッシュしたばかりのデータにアクセスできることを意味します。ただし、必ずしもディスクに「永続的に」保存されていることを意味するわけではありません。
そのためには、os.fsync
すべてのオペレーティング システム バッファーが対象のストレージ デバイスと同期されていることを確認するメソッドを呼び出す必要があります。つまり、そのメソッドはオペレーティング システム バッファーからディスクにデータをコピーします。
通常、どちらの方法も気にする必要はありませんが、実際にディスクに何が保存されるかについて心配する必要のあるシナリオの場合は、指示に従って両方の呼び出しを行う必要があります。
2018年の補遺。
キャッシュ機構を備えたディスクは2013年に比べてはるかに一般的になり、今ではさらに多くのレベルのキャッシュとバッファが関与していることに注意してください。仮定するこれらのバッファは sync/flush 呼び出しによっても処理されますが、よくわかりません。