测试缓冲区是否已在R中刷新

Ite*_*tor 6 io buffer r memory-mapped-files bigdata

我有一些大的,大的文件,我使用,我使用几个不同的I/O函数来访问它们.最常见的是bigmemory包装.

在写入文件时,我已经学会了刷新输出缓冲区的困难方法,否则所有的注意都是关闭数据是否已保存.然而,这可能会导致一些非常长的等待时间bigmemory(很多分钟).我不知道为什么会发生这种情况 - 它并不总是会发生,而且不容易复制.

有没有办法确定是否在R中刷新了I/O缓冲区,特别是对于bigmemory?如果操作系统很重要,那么请随意以这种方式约束答案.

如果答案可以推广到更远bigmemory,那将是很好的,因为我有时依赖于其他内存映射函数或I/O流.

如果没有很好的解决方案来检查缓冲区是否已被刷新,是否可以假设缓冲区已被刷新?即使用flush().

更新:我应该澄清这些都是二进制连接.@RichieCotton指出isIncomplete(),虽然帮助文档只提到了文本连接.目前尚不清楚它是否可用于二进制连接.

Ite*_*tor 0

我将提出我自己的答案,但我欢迎任何更清晰的答案。

据我目前所见,各种连接函数,例如fileopencloseflushisOpen、 和isIncomplete(以及其他),都是基于特定的连接类型,例如文件、管道、URL 和其他一些东西。

相反,bigmemory它有自己的连接类型,并且 bigmemory 对象是一个 S4 对象,具有用于操作系统缓冲区的内存地址的插槽。一旦放置在那里,操作系统就负责刷新这些缓冲区。由于这是操作系统的责任,因此获取“脏”缓冲区的信息需要与操作系统交互,而不是与 R 交互。

因此,答案bigmemory是“否”,因为数据存储在内核缓冲区中,尽管对于通过 STDIO 处理的其他连接(即存储在“用户空间”中)来说,答案可能是“是”。

有关操作系统/内核方面的更多见解,请参阅SO 上的这个问题;我正在研究几个产生缓冲区刷新好奇心的程序(不仅仅是 R + bigmemory),并且该线程帮助我了解了内核方面的事情。