与在RStudio中使用saveRDS相关的时间问题

与在RStudio中使用saveRDS相关的时间问题,r,rstudio,R,Rstudio,在执行循环之前调用saverd会导致循环计时不一致。这只有在使用RStudio时才明显;使用Rscript从命令行运行同一脚本时,不存在此问题。这可能是RStudio中I/O刷新延迟的结果 其他人注意到这种行为了吗 有没有办法在saveRDS调用后强制I/O刷新 在Ubuntu 18.04LTS 64位上使用RStudio 1.1.463、R3.5.2 我通过在代码执行之前调用gc()并使用gcinfo启用gc消息来确保没有触发gc,从而消除了垃圾收集器的问题。我还尝试用cmpfun预编译函

在执行循环之前调用saverd会导致循环计时不一致。这只有在使用RStudio时才明显;使用Rscript从命令行运行同一脚本时,不存在此问题。这可能是RStudio中I/O刷新延迟的结果

  • 其他人注意到这种行为了吗
  • 有没有办法在saveRDS调用后强制I/O刷新
在Ubuntu 18.04LTS 64位上使用RStudio 1.1.463、R3.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()
请注意,大延迟并不总是出现在同一次迭代中

删除代码中的saveRDS调用将始终产生一致(接近10毫秒)的循环计时


通过Rscript从命令行运行代码可以使用saveRDS行,也可以不使用saveRDS行。

以下是RStudio的同事们的回应:

一种可能性是:RStudio在R“空闲”期间(即:当R调用R_ProcessEvents时)做一些后台工作,我认为项目文件索引就是其中之一。RStudio为这些任务注册文件监视器,因此创建文件可能会导致RStudio在幕后执行一些重新索引的工作

我验证了将saveRDS()调用中的save目录更改为项目目录之外会消除计时问题。所以我认为这支持了文件索引理论。rstudiov1.2预览版在较小程度上展示了这种行为,因此空闲处理实现中可能发生了一些变化,但我没有关于这方面的进一步信息。RStudio的人打开了一个bug报告来解决这个问题,所以希望很快就能得到修复

因此,目前的一些解决办法是:

  • 在调用saveRDS()后,以足够的延迟调用Sys.sleep(),以允许执行重新索引操作
  • 将saveRDS()指向当前项目目录之外的文件,以防止重新编制索引

  • 以下是RStudio的同事们的回应:

    一种可能性是:RStudio在R“空闲”期间(即:当R调用R_ProcessEvents时)做一些后台工作,我认为项目文件索引就是其中之一。RStudio为这些任务注册文件监视器,因此创建文件可能会导致RStudio在幕后执行一些重新索引的工作

    我验证了将saveRDS()调用中的save目录更改为项目目录之外会消除计时问题。所以我认为这支持了文件索引理论。rstudiov1.2预览版在较小程度上展示了这种行为,因此空闲处理实现中可能发生了一些变化,但我没有关于这方面的进一步信息。RStudio的人打开了一个bug报告来解决这个问题,所以希望很快就能得到修复

    因此,目前的一些解决办法是:

  • 在调用saveRDS()后,以足够的延迟调用Sys.sleep(),以允许执行重新索引操作
  • 将saveRDS()指向当前项目目录之外的文件,以防止重新编制索引

  • 今天已尝试RStudio v1.2预览版。这个问题也存在,但程度要小得多。由于saveRDS的存在,迭代时间不是约275ms,而是约24ms。就此向RStudio提交了一份通知单。今天已尝试RStudio v1.2预览版。这个问题也存在,但程度要小得多。由于saveRDS的存在,迭代时间不是约275ms,而是约24ms。就此事向RStudio提交了一份通知单。
    [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