了解Ruby和OS I/O缓冲
在Ruby中IO缓冲是如何工作的?使用了解Ruby和OS I/O缓冲,ruby,operating-system,io,buffering,io-buffering,Ruby,Operating System,Io,Buffering,Io Buffering,在Ruby中IO缓冲是如何工作的?使用IO和文件类时,数据刷新到底层流的频率是多少?这与操作系统缓冲相比如何?在自信地将给定数据读回进行处理之前,需要做些什么来确保已将其写入磁盘?Ruby IO文档并不是100%清楚这种缓冲是如何工作的,但您可以从文档中提取以下内容: Ruby IO有自己的内部缓冲区 除此之外,底层操作系统可能会进一步缓冲数据,也可能不会 要查看的相关方法: :刷新IO。我还查看了Ruby源代码,调用IO.flush也调用底层操作系统。这应该足以缓存文件,但不能保证将物理
IO
和文件
类时,数据刷新到底层流的频率是多少?这与操作系统缓冲相比如何?在自信地将给定数据读回进行处理之前,需要做些什么来确保已将其写入磁盘?Ruby IO文档并不是100%清楚这种缓冲是如何工作的,但您可以从文档中提取以下内容:
- Ruby IO有自己的内部缓冲区
- 除此之外,底层操作系统可能会进一步缓冲数据,也可能不会
- :刷新
。我还查看了Ruby源代码,调用IO
IO.flush也调用底层操作系统。这应该足以缓存文件,但不能保证将物理数据存储到磁盘
- :如果设置为
,则不会执行Ruby内部缓冲。所有内容都会立即发送到操作系统,并且每次写入都会调用true
fflush()
- :返回当前同步设置(
或true
)false
- :刷新操作系统上的两个Ruby缓冲区+调用(如果支持)。这将保证完全刷新物理磁盘文件
- :关闭Ruby
并将挂起的数据写入操作系统。请注意,这并不意味着IO
。上的POSIX文档表示,它不保证数据以物理方式写入文件。因此,需要使用显式的fsync()
调用fsync()
flush
和/或close
应足以缓存文件,以便其他进程或操作可以完全读取该文件。要确定地将文件一直传送到物理介质,需要调用IO.fsync
其他相关方法:
- :绕过Ruby内部缓冲区,直接进行OS
写入操作。如果使用此选项,请不要将其与
混合使用IO.read/write
- :同上,但用于阅读
- Ruby在操作系统的顶部进行内部缓冲。执行file.flush时,Ruby将刷新其内部缓冲区。要确保文件写入磁盘,需要执行file.fsync。但最终你无法确定文件是否写入磁盘,这取决于操作系统、硬盘驱动器控制器和硬盘驱动器