2011-07-14 12 views
26

RubyでIOバッファリングはどのように機能しますか? IOクラスとFileクラスを使用しているときに、データが基本ストリームにフラッシュされる頻度これはOSのバッファリングとどのように比較されますか?与えられたデータがディスクに書き込まれたことを保証するために、処理のためにそれを確実に読み取るためには、何をする必要がありますか?RubyとOSのI/Oバッファリングの理解

答えて

48

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

  • RubyのIOは、それに加えて、独自の内部バッファ
  • を持っています基礎となるオペレーティングシステムは、データをさらにバッファリングしてもよいし、しなくてもよい。

を見て、関連する方法:

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

結論:flushおよび/またはcloseが、それは別のプロセスや操作によって完全に読み取ることができるようにファイルをキャッシュし取得するのに十分でなければなりません。ファイルを確実に物理メディアに届けるには、IO.fsyncに電話する必要があります。

その他の関連メソッド:

  • IO.syswrite:バイパスRubyの内部バッファとストレートOS writeを行います。これを使用する場合は、IO.read/writeと混同しないでください。
  • IO.sysread:上記と同じですが、読んでください。
1

Rubyは、OSの上で内部バッファリングを行います。 file.flushを実行すると、Rubyは内部バッファをフラッシュします。ファイルがディスクに書き込まれるようにするには、file.fsyncを実行する必要があります。しかし、最終的には、ファイルがディスクに書き込まれていることは確かではありません。OS、HDDコントローラ、HDDに依存します。

関連する問題