IOバッファリングはRubyでどのように機能しますか?IO
およびFile
クラスを使用する場合、データはどのくらいの頻度で基になるストリームにフラッシュされますか?これはOSと比較してどうですか?バッファリング?処理のために自信を持って読み戻す前に、特定のデータがディスクに書き込まれたことを保証するために何をする必要がありますか?
Ruby IOドキュメントは、このバッファリングがどのように機能するかについて100%明確ではありませんが、これはドキュメントから抽出できるものです。
関連する方法:
IO.flush
_ :IO
をフラッシュします。また、Rubyソースを調べ、_IO.flush
_を呼び出すと、基盤となるOS fflush()
も呼び出されます。これでファイルをキャッシュできますが、ディスクへの物理データを保証するものではありません。IO.sync=
_ :true
に設定すると、Ruby内部バッファリングは行われません。すべてがすぐにOSに送信され、fflush()
は書き込みごとに呼び出されます。IO.sync
_ :現在の同期設定(true
またはfalse
)を返します。IO.fsync
_ :OS上のRubyバッファ+呼び出し fsync()
の両方をフラッシュします(サポートしている場合)。これにより、物理ディスクファイルまで完全にフラッシュします。IO.close
_ :Ruby IO
を閉じ、保留中のデータをOSに書き込みます。これはfsync()
を意味しないことに注意してください。POSIXドキュメントon close()
は、データがファイルに物理的に書き込まれることを保証しないことを示しています。そのため、明示的なfsync()
呼び出しを使用する必要があります。結論:flush
および/またはclose
は、ファイルをキャッシュして、別のプロセスまたは操作で完全に読み取ることができるようにするのに十分なはずです。ファイルを確実に物理メディアに到達させるには、_IO.fsync
_を呼び出す必要があります。
その他の関連する方法:
IO.syswrite
_ :Ruby内部バッファをバイパスし、ストレートOS write
を実行します。これを使用する場合は、_IO.read/write
_。IO.sysread
_ :上記と同じですが、読み取り用です。RubyはOS上で内部バッファリングを行います。 file.flush Rubyは、その内部バッファーをフラッシュします。ファイルがディスクに書き込まれるようにするには、file.fsyncを実行する必要があります。しかし、最終的には、ファイルが書き込まれるかどうかを確認できません。とにかくディスクに、それはOS、hddコントローラーとhddに依存します。