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

时间:2011-08-08 21:56:09

标签: r io memory-mapped-files buffer bigdata

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

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

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

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

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

更新:我应该澄清这些都是二进制连接。 @RichieCotton注意到isIncomplete(),尽管帮助文档仅提到了文本连接。目前尚不清楚它是否可用于二进制连接。

2 个答案:

答案 0 :(得分:0)

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)

(从帮助(连接)文件修改。)

答案 1 :(得分:0)

我会提出自己的答案,但我欢迎更清楚的事情。

从我到目前为止看到的各种连接功能,例如fileopencloseflushisOpenisIncomplete(以及其他)基于特定的连接类型,例如文件,管道,URL和其他一些东西。

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

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

有关操作系统/内核方面的更多信息,请参阅this question on SO;我正在研究一些产生缓冲区刷新好奇心的程序(不仅仅是R + bigmemory),这个线程有助于启发我关于内核方面的事情。