32

RubyではIOバッファリングはどのように機能しますか?IOおよびFileクラスを使用する場合、データはどのくらいの頻度で基になるストリームにフラッシュされますか?これはOSバッファリングとどのように比較されますか?処理のために自信を持って読み戻す前に、特定のデータがディスクに書き込まれていることを保証するために何をする必要がありますか?

4

2 に答える 2

57

Ruby IOのドキュメントは、このバッファリングがどのように機能するかについて100%明確ではありませんが、ドキュメントから抽出できるものは次のとおりです。

  • RubyIOには独自の内部バッファがあります
  • それに加えて、基盤となるオペレーティングシステムは、データをさらにバッファリングする場合としない場合があります。

関連する方法:

  • IO.flush:フラッシュしIOます。また、RubyソースとIO.flush、基盤となるOSを呼び出すための呼び出しも調べましたfflush()。これはファイルをキャッシュするのに十分なはずですが、ディスクへの物理データを保証するものではありません。
  • IO.sync=:に設定するtrueと、Rubyの内部バッファリングは行われません。すべてがすぐにOSに送信され、fflush()書き込みごとに呼び出されます。
  • IO.sync:現在の同期設定(trueまたはfalse)を返します。
  • IO.fsyncfsync(): OS上のRubyバッファと呼び出しの両方をフラッシュします(サポートされている場合)。これにより、物理ディスクファイルまでの完全なフラッシュが保証されます。
  • IO.close:RubyIOを閉じ、保留中のデータをOSに書き込みます。これはを意味するものではないことに注意してくださいfsync()。のPOSIXドキュメントにclose()は、データがファイルに物理的に書き込まれることを保証するものではないと記載されています。fsync()したがって、そのために明示的な呼び出しを使用する必要があります。

結論:flushおよび/またはcloseファイルをキャッシュして、別のプロセスまたは操作で完全に読み取ることができるようにするのに十分なはずです。ファイルを確実に物理メディアに到達させるには、を呼び出す必要がありますIO.fsync

その他の関連する方法:

  • IO.syswrite:Ruby内部バッファをバイパスし、ストレートOSを実行しますwrite。これを使用する場合は、と混合しないでくださいIO.read/write
  • IO.sysread:上記と同じですが、読むためのものです。
于 2011-07-15T00:16:37.030 に答える
3

RubyはOS上で内部バッファリングを行います。file.flushを実行すると、Rubyはその内部バッファーをフラッシュします。ファイルがディスクに書き込まれるようにするには、file.fsyncを実行する必要があります。しかし、結局のところ、ファイルがディスクに書き込まれていることを確認することはできません。それは、OS、hddコントローラー、およびhddによって異なります。

于 2011-07-15T01:46:41.810 に答える