Ruby 中的 IO 缓冲如何工作?使用时数据刷新到底层流的频率是多少IO
and File
课程?这与操作系统缓冲相比如何?在自信地读回数据进行处理之前,需要做什么来保证给定的数据已写入磁盘?
Ruby IO 文档并不是 100% 清楚地说明了缓冲的工作原理,但您可以从文档中提取以下内容:
- Ruby IO 有自己的内部缓冲区
- 除此之外,底层操作系统可能会也可能不会进一步缓冲数据。
相关方法可以看看:
-
IO.flush http://ruby-doc.org/core/classes/IO.html#M000929:冲洗
IO
。我还查看了 Ruby 源代码并调用IO.flush
还调用底层操作系统fflush() http://pubs.opengroup.org/onlinepubs/9699919799/functions/fflush.html。这应该足以缓存文件,但不能保证将物理数据写入磁盘。
-
IO.sync= http://ruby-doc.org/core/classes/IO.html#M000911:如果设置为
true
,没有进行 Ruby 内部缓冲。所有内容都会立即发送到操作系统,并且fflush()
每次写入都会被调用。
-
IO.sync http://ruby-doc.org/core/classes/IO.html#M000910:返回当前同步设置(
true
or false
).
-
IO.fsync http://ruby-doc.org/core/classes/IO.html#M000908:刷新 Ruby 缓冲区 + 调用fsync() http://pubs.opengroup.org/onlinepubs/9699919799/functions/fsync.html在操作系统上(如果支持的话)。这将保证完全刷新到物理磁盘文件。
-
IO.close http://ruby-doc.org/core/classes/IO.html#M000939:关闭红宝石
IO
并将待处理的数据写入操作系统。请注意,这并不意味着fsync()
。 POSIX 文档close() http://pubs.opengroup.org/onlinepubs/9699919799/functions/close.html说它不保证数据物理写入文件。所以你需要使用显式的fsync()
呼吁这一点。
结论:flush
and/or close
应该足以缓存文件,以便另一个进程或操作可以完全读取该文件。要确定地将文件一直传输到物理介质,您需要调用IO.fsync
.
其他相关方法:
-
IO.syswrite http://ruby-doc.org/core/classes/IO.html#M000904:绕过 Ruby 内部缓冲区并执行直接操作系统
write
。如果您使用此产品,请勿将其与IO.read/write
.
-
IO.sysread http://ruby-doc.org/core/classes/IO.html#M000905:与上面相同,但用于阅读。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)