6

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

在写入文件时,我已经学会了刷新输出缓冲区的艰难方法,否则所有关于数据是否已保存的赌注都将失败。但是,这可能会导致一些非常长的等待时间,同时bigmemory执行它的操作(很多分钟)。我不知道为什么会发生这种情况——它并不总是发生,也不容易复制。

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

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

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

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

4

2 回答 2

0

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

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

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

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

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

于 2011-08-22T15:28:39.150 回答
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)

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

于 2011-08-08T23:32:00.050 回答