如何重新启动R并从上一行(在Windows上)继续执行基准测试脚本?

时间:2019-05-13 18:39:37

标签: r profiling benchmarking

我想对应用于不同数据集大小的多个函数(具有随机效应的回归和其他分析)使用的时间和配置文件内存进行基准测试。 我的计算机有16GB的RAM,我想看看R在大型数据集中的表现以及限制是什么。

为此,我使用了循环和包 bench

每次迭代后,我都使用gc(reset = TRUE)清理内存。
但是,当数据集非常大时,垃圾收集器将无法正常工作,只会释放部分内存。
最后,所有的内存都保持满,我需要重新启动R会话。

我的完整数据集称为allDT,我这样做:

for (NN in (1:10)*100000)  {
    gc(reset=TRUE)  
    myDT <- allDT[sample(.N,NN)]
    assign(paste0("time",NN), mark( 
      model1 = glmer(Out~var1+var2+var3+(1|City/ID),data=myDT),
      model2 = glmer(Out~var1+var2+var3+(1|ID),data=myDT),
    iterations = 1, check=F))
}

这样,我可以获得每种尺寸的结果。

这种方法不公平,因为最后无法正确清理内存。

我认为另一种选择是在每次迭代后重新启动整个R程序(退出R并重新启动,这是我发现可以清除内存的唯一方法),再次加载数据并继续从最后一步开始。

有没有简单的方法可以做到? 也许我每次都需要将结果保存在磁盘上,但是很难跟踪最后执行的行,特别是如果R挂起。 我可能需要创建一个外部批处理文件,并在每次迭代时运行一个调用R的循环。尽管我更喜欢R中的所有操作,而无需任何外部脚本/批处理。

1 个答案:

答案 0 :(得分:2)

我为基准测试所做的一件事是启动R的另一个实例,并让另一个R实例将结果返回到stdout(或更简单的是,将其另存为文件)。

示例:

times <- c()
for( i in 1:length(param) ) {
   system(sprintf("Rscript functions/mytest.r %s", param[i]))
   times[i] <- readRDS("/tmp/temp.rds")
}

mytest.r文件中读入参数并将结果保存到文件中。

args <- commandArgs(trailingOnly=TRUE)
NN <- args[1]
allDT <- readRDS("mydata.rds")
...
# save results
saveRDS(myresult, file="/tmp/temp.rds")