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

测试R中是否已刷新缓冲区,r,io,memory-mapped-files,buffer,bigdata,R,Io,Memory Mapped Files,Buffer,Bigdata,我有一些很大很大的文件,我使用几个不同的I/O函数来访问它们。最常见的是bigmemory包 在写入文件时,我学到了刷新输出缓冲区的困难方法,否则所有的赌注都会落在数据是否保存上。但是,这可能会导致在bigmemory执行任务时出现很长的等待时间(很多分钟)。我不知道为什么会发生这种情况——它并不总是发生,也不容易复制 是否有某种方法可以确定R中是否已刷新I/O缓冲区,特别是对于bigmemory?如果操作系统很重要,那么可以用这种方式随意限制答案 如果一个答案可以推广到bigmemory之外,

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

在写入文件时,我学到了刷新输出缓冲区的困难方法,否则所有的赌注都会落在数据是否保存上。但是,这可能会导致在
bigmemory
执行任务时出现很长的等待时间(很多分钟)。我不知道为什么会发生这种情况——它并不总是发生,也不容易复制

是否有某种方法可以确定R中是否已刷新I/O缓冲区,特别是对于
bigmemory
?如果操作系统很重要,那么可以用这种方式随意限制答案

如果一个答案可以推广到bigmemory之外,那就太好了,因为我有时依赖于其他内存映射函数或I/O流

如果没有很好的解决方案来检查缓冲区是否已刷新,是否存在可以假定缓冲区已刷新的情况?即除了使用
flush()


更新:我应该澄清这些都是二进制连接@RichieCotton指出,
是不完整的()
,尽管帮助文档只提到文本连接。目前还不清楚这是否适用于二进制连接。

isIncomplete()是否适用于二进制文件

# R process 1
zz <- file("~/test", "wb")
writeBin(c(1:100000),con=zz)
close(zz)

# R process 2
zz2 <- file("~/test", "rb")
inpp <- readBin(con=zz2, integer(), 10000)
while(isIncomplete(con2)) {Sys.sleep(1); inpp <- c(inpp, readBin(zz2),integer(), 10000)}
close(zz2)
#R过程1

zz我会提出我自己的答案,但我欢迎任何更清楚的答案

从目前为止我所看到的情况来看,各种连接功能,例如
文件
打开
关闭
刷新
isOpen
,以及
isIncomplete
(等等),都是基于特定的连接类型,例如文件、管道、URL和其他一些东西

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

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


有关操作系统/内核方面的更多信息,请参阅;我正在研究几个程序(不仅仅是R+bigmemory),它们产生了缓冲区刷新的奇特现象,并且该线程帮助我了解了内核方面的情况。

不确定如何使用
bigmemory
,但是
isIncomplete
适用于常规连接。谢谢!关于连接的非常有限的帮助信息只提到isIncomplete适合于文本连接的输出。您在二进制连接方面运气好吗?谢谢您的测试。但是,除非我误解了这一点,否则您的示例仅在输入缓冲区的情况下使用它。我不太清楚它对输出缓冲区是否有效。我对输出缓冲不够熟悉,无法确定是否可以用同样的方法测试它。我只是不愿意超出文档的范围——如果它的行为是随机的,而不是确定性的,那么我就冒着一堆损坏数据的风险。我一直在走这条路,所以我很谨慎经过进一步测试,我认为
isIncomplete()
不适用于
bigmemory
对象:似乎这些对象是某种类型的指针,而不是连接:(感谢您的建议和示例。事实证明,在这种情况下,缓冲区是在R之外处理的。