[解決済み] file.flush()はいったい何をしているのですか?
質問
Pythonの中にこんなものがありました。 ファイルオブジェクトのドキュメント :
flush()
は、必ずしもファイルのデータをディスクに書き込むとは限りません。使用方法flush()
に続いてos.fsync()
を使用すると、この動作を確実に行うことができます。
そこで質問なのですが、Pythonの
flush
は何をしているのでしょうか?私は、それが強制的にデータをディスクに書き込むと思っていたのですが、今はそうではないことがわかります。なぜでしょうか?
解決方法は?
通常、2段階のバッファリングが行われます。
- 内部バッファ
- オペレーティングシステムバッファ
内部バッファは、プログラミングを行うランタイム/ライブラリ/言語によって作成されるバッファで、書き込みのたびにシステムコールを行わないようにすることで、高速化を図るものです。その代わり、ファイルオブジェクトに書き込むときはそのバッファに書き込み、バッファがいっぱいになるたびに、システムコールを使って実際のファイルにデータを書き込む。
しかし、OSのバッファの関係で、この場合、データが書き込まれるのは ディスクへ . ランタイムが保持するバッファからオペレーティングシステムが保持するバッファにデータがコピーされることを意味するだけかもしれません。
何かを書いて、それがバッファ(だけ)になってしまい、マシンの電源が切れると、そのデータはディスク上にない。
そこで、それを支援するために
flush
と
fsync
メソッドをそれぞれのオブジェクトに追加します。
1つ目は
flush
は、プログラムバッファに残っているデータを実際のファイルに書き出すだけです。一般的に、これはデータがプログラム・バッファからオペレーティング・システム・バッファにコピーされることを意味します。
具体的には、他のプロセスが同じファイルを読み込むために開いている場合、ファイルに流したばかりのデータにアクセスできるようになるということです。しかし、これは必ずしもデータがディスクに永久に保存されたことを意味するものではありません。
そのためには
os.fsync
このメソッドは、すべてのオペレーティング・システム・バッファが、その対象となるストレージ・デバイスと同期していることを保証します。
通常、どちらのメソッドも使用する必要はありませんが、実際にディスクに保存される内容についてのパラノイアが良いことであるシナリオにいる場合、指示通りに両方の呼び出しを行う必要があります。
2018年追記
キャッシュ機構を持つディスクは2013年当時よりもはるかに一般的になっており、現在はさらに多くのレベルのキャッシュとバッファが関係していることに注意してください。I とする これらのバッファもsync/flushの呼び出しで処理されますが、実際のところはわかりません。
関連
-
[解決済み】TypeErrorを取得しました。エントリを持つ子テーブルの後に親テーブルを追加しようとすると、 __init__() missing 1 required positional argument: 'on_delete'
-
[解決済み] builtins.TypeError: strでなければならない、bytesではない
-
[解決済み] 文字列リテラルの前にある'b'文字は何を意味するのでしょうか?
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] __init__.py は何のためにあるのですか?
-
[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?
-
[解決済み] pandasを使った "大量データ "ワークフロー【終了しました
-
[解決済み】if __name__ == "__main__": は何をするのでしょうか?
-
[解決済み】__str__と__repr__の違いは何ですか?
-
[解決済み] Pythonマルチプロセッシングモジュールの.join()メソッドは一体何をしているのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonの非常に便利な2つのデコレーターを解説
-
PythonはWordの読み書きの変更操作を実装している
-
python implement mysql add delete check change サンプルコード
-
[解決済み】pygame.error: ビデオシステムが初期化されていない
-
[解決済み】socket.error: [Errno 48] アドレスはすでに使用中です。
-
[解決済み] 'DataFrame' オブジェクトに 'sort' 属性がない
-
[解決済み】syntaxError: 'continue' がループ内で適切に使用されていない
-
[解決済み】SyntaxError: デフォルト以外の引数がデフォルトの引数に続く
-
[解決済み】ValueError: xとyは同じサイズでなければならない
-
[解決済み] Pythonで大きなファイルをリクエストでダウンロードする