无缓冲文件I / O的后果

时间:2011-07-15 18:43:35

标签: ruby io buffer stdout stderr

使用无缓冲的文件I / O将大量数据写入磁盘会产生什么后果(至少对于高于操作系统级别的所有内容)?

详细信息:

我正在编写一个Ruby脚本,它将执行另一段代码,捕获它的stdout和stderr并将它们写入文件。显然(至少在Ruby中),stderr是无缓冲的并且stdout是缓冲的,在我的情况下会导致无序输出,因为stderr行在某些stdout行之前被打印。

似乎解决方案是让这部分代码使用无缓冲的IO(IO.sync = true)。但是,我的脚本运行的代码片段也会将大量文本写入磁盘。所以我想知道不使用Ruby缓冲区(只有OS缓冲区及以下)的后果是什么,如果它很重要,我怎么能绕过订购问题?

2 个答案:

答案 0 :(得分:1)

当写操作的计数较少且无法进行大量计数写操作时,无缓冲I / O比缓冲I / O慢。在每个操作大约1,000到10,000个字节的中间范围内,它没有太大区别。

当操作对齐时,您还会看到稍微好一点的性能

答案 1 :(得分:0)

IO.sync做的是切换缓冲区的自动刷新,但不会改变它仍然被缓冲的事实。

您可能想要的是完全绕过缓冲系统并改为使用IO#syswrite

STDERR.syswrite("Look ma, no buffers")

正如文档所说,你应该选择缓冲或非缓冲,并坚持下去,因为混合和匹配会导致问题。