jrd*_*oko 30 ruby io operating-system buffering io-buffering
IO缓冲如何在Ruby中工作?使用IO和File类时,数据刷新到底层流的频率是多少?这与OS缓冲相比如何?需要做些什么来保证给定数据写入磁盘,然后自信地将其读回处理?
Cas*_*per 56
关于此缓冲如何工作,Ruby IO文档并非100%明确,但您可以从文档中提取:
要看的相关方法:
IO.flush:冲洗IO.我还查看了Ruby源代码,并IO.flush调用了底层操作系统fflush().这应该足以使文件缓存,但不保证物理数据到磁盘.IO.sync=:如果设置为true,则不执行Ruby内部缓冲.一切都被立即发送到操作系统,fflush()每次写入都会被调用.IO.sync:返回当前的同步设置(true或false).IO.fsync:刷新fsync()操作系统上的Ruby缓冲区+调用(如果它支持它).这将保证完全刷新到物理磁盘文件.IO.close:关闭Ruby IO并将待处理数据写入操作系统.请注意,这并不意味着fsync().POSIX文档close()说它不保证数据物理写入文件.所以你需要使用显式fsync()调用.结论:flush和/或close应足以使文件缓存,以便其他进程或操作可以完全读取.要确保文件一直到达物理媒体,您需要打电话IO.fsync.
其他相关方法:
IO.syswrite:绕过Ruby内部缓冲区并执行直接操作系统write.如果你使用它,那么不要与它混合IO.read/write.IO.sysread:与上面相同,但是用于阅读.