164

File Objectsの Pythonドキュメントでこれを見つけました。

flush()必ずしもファイルのデータをディスクに書き込むわけではありません。この動作を保証するにflush()は、後に続くを使用します。os.fsync()

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

4

4 に答える 4

264

通常、関連するバッファリングには 2 つのレベルがあります。

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

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

ただし、オペレーティング システムのバッファが原因で、これはデータがディスクに書き込まれることを意味しない場合があります。これは、ランタイムによって維持されているバッファから、オペレーティング システムによって維持されているバッファにデータがコピーされることを意味するだけかもしれません。

何かを書き込んで、それがバッファ (のみ) に入り、マシンの電源が切られた場合、そのデータはマシンの電源がオフになったときにディスク上にありません。

したがって、それを支援するために、それぞれのオブジェクトにメソッドflushとメソッドがあります。fsync

最初の はflush、プログラム バッファに残っているデータを実際のファイルに単純に書き出します。通常、これはデータがプログラム バッファからオペレーティング システム バッファにコピーされることを意味します。

具体的には、別のプロセスが同じファイルを読み取り用に開いている場合、ファイルにフラッシュしたばかりのデータにアクセスできることを意味します。ただし、必ずしも「永続的に」ディスクに保存されているとは限りません。

これを行うには、すべてのオペレーティング システム バッファーが対象のストレージ デバイスと確実に同期されるようにするメソッドを呼び出す必要がありos.fsyncます。つまり、そのメソッドは、オペレーティング システム バッファーからディスクにデータをコピーします。

通常、どちらの方法も気にする必要はありませんが、実際にディスク上に何が残るかについてパラノイアが良いシナリオの場合は、指示に従って両方の呼び出しを行う必要があります。


2018年追記。

キャッシュ メカニズムを備えたディスクは 2013 年よりもはるかに一般的になっているため、キャッシュとバッファーのレベルがさらに高くなっていることに注意してください。これらのバッファはsync /flush 呼び出しでも処理されると思いますが、よくわかりません。

于 2011-08-19T20:40:36.020 に答える
12

オペレーティングシステムがそうしない可能性があるためです。フラッシュ操作はファイル データを RAM のファイル キャッシュに強制的に格納し、そこから実際にディスクに送信するのは OS の仕事です。

于 2011-08-19T20:34:58.503 に答える
8

内部バッファをフラッシュします。これにより、OS がバッファをファイルに書き出すことになっています。[1] Python は、特に設定しない限り、OS のデフォルトのバッファリングを使用します。

しかし、OS がまだ協力しないことを選択する場合もあります。特に、Windows/NTFS での書き込み遅延などの素晴らしい点については。基本的に内部バッファはフラッシュされますが、OS バッファはまだそれを保持しています。そのため、そのような場合にディスクに書き込むように OS に指示する必要がありますos.fsync()

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

于 2011-08-19T20:44:46.313 に答える