2011-08-08 41 views
6

我有一些大的大文件可以使用,我使用几种不同的I/O函数来访问它们。最常见的是bigmemory包。测试缓冲区是否已经刷新R

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

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

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

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

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

+0

不确定使用'bigmemory',但'isIncomplete'适用于常规连接。 –

+0

谢谢!关于连接的非常有限的帮助信息只提到isIncomplete适用于输出文本连接。你有幸用二进制连接? – Iterator

回答

0

我会提出我自己的答案,但我欢迎任何更清晰。根据目前我所看到的,各种连接功能,例如, file,open,closeflush,isOpenisIncomplete(等等),基于特定的连接类型,例如,文件,管道,URL和其他一些东西。

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

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

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

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) 

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

+0

感谢您对此进行测试。但是,除非我误解了这个,否则您的示例仅在输入缓冲区中使用它。我不清楚它是否在输出缓冲区上工作。我不太熟悉输出缓冲,以确定我们是否可以用相同的方式进行测试。我只是不愿意超越文档 - 如果它的行为是随机的,而不是确定性的,那么我冒着一堆损坏的数据的风​​险。我一直在那条路上,所以我很谨慎。 :) – Iterator

+0

进一步测试后,我不认为'isIncomplete()'适用于'bigmemory'对象:看起来对象是某种类型的指针,而不是连接。 :( – Iterator

+0

感谢您的建议和示例。事实证明,在这种情况下缓冲区是在R之外处理的。 – Iterator