使用未缓冲的文件I/O将大量数据写入磁盘(至少对于操作系统级别以上的所有内容)的后果是什么?
细节:
我正在编写一个Ruby脚本,它将执行另一段代码,捕获其标准输出和标准错误并将它们写入文件。显然(至少在Ruby中),标准错误没有被缓冲,而标准输出被缓冲,在我的例子中,这会导致无序输出,因为标准错误行在一些标准输出行之前被打印。
似乎解决方案是使这部分代码使用无缓冲IO(与IO.sync = true
)。但是,我的脚本正在运行的代码段也将向磁盘写入大量文本。所以我想知道不使用Ruby缓冲区(只使用OS缓冲区及以下)的后果是什么,如果它很重要,我还能如何解决排序问题?
当写操作计数较小时,非缓冲I/O比缓冲I/O慢,而当写操作计数较大时,情况正好相反。在每个操作大约1,000到10,000字节的中间范围内,它没有太大的区别。
当操作对齐时,您还会看到稍好的性能
IO.sync
所做的是切换缓冲区的自动刷新,但不改变它仍然被缓冲的事实。
你可能想要的是完全绕过缓冲系统,而使用io# syswrite:
STDERR.syswrite("Look ma, no buffers")
正如文档所说,您应该选择缓冲的或未缓冲的,并坚持使用,因为混合和匹配可能会导致问题。