【发布时间】:2019-03-31 23:25:22
【问题描述】:
在执行循环之前调用 saveRDS 会导致循环时序不一致。这仅在使用 RStudio 时很明显;使用 Rscript 从命令行运行相同的脚本时,该问题不存在。这可能是 RStudio 中延迟 I/O 刷新的结果。
- 其他人是否注意到了这种行为?
- 有没有办法在 saveRDS 调用后强制刷新 I/O?
在 Ubuntu 18.04LTS 64 位上使用 RStudio 1.1.463、R 3.5.2。
我通过在代码执行之前调用 gc() 并使用 gcinfo 启用 gc 消息以确保不触发 gc 来消除垃圾收集器的问题。我还尝试使用 cmpfun 预编译该函数;这也无济于事。
以下代码可用于重现该问题。
loop.test <- function() {
t <- c()
t0 <- Sys.time()
for (i in 1:10) {
t <- c(t, Sys.time() - t0)
Sys.sleep(0.01)
}
dt <- round(1000 * diff(t), 1)
print(dt)
print(summary(dt))
}
saveRDS(1:10, 'garb.rds')
loop.test()
代码将产生以下输出(以毫秒为单位的循环时间):
[1] 10.1 10.1 10.2 10.2 275.4 10.2 10.1 10.2 10.2
Min. 1st Qu. Median Mean 3rd Qu. Max.
10.10 10.10 10.20 39.63 10.20 275.40
请注意,大延迟并不总是出现在同一迭代中。
删除代码中的 saveRDS 调用将始终产生一致(接近 10 毫秒)的循环时间。
通过 Rscript 从命令行运行代码可以使用和不使用 saveRDS 行。
【问题讨论】:
-
今天试用了 RStudio v1.2 预览版。那里也存在这个问题,但程度要小得多。由于 saveRDS,迭代时间不是~275ms,而是~24ms。就此向 RStudio 提交了一张票。