【问题标题】:How to restart R and continue a benchmark script from previous line (on Windows)?如何重新启动 R 并从上一行(在 Windows 上)继续执行基准测试脚本?
【发布时间】:2019-05-13 18:39:36
【问题描述】:

我想对应用于不同数据集大小的几个函数(具有随机效应的回归和其他分析)使用的时间和配置文件内存进行基准测试。 我的计算机有 16GB 内存,我想看看 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 中完成所有工作。

【问题讨论】:

  • 您好,这不是您问题的直接答案,但也许会对您有所帮助。您可以使用函数 memory.limit() 来获取您的电脑拥有的可用内存(RAM)。您还可以使用函数 memory.limit() 以这种方式从 HDD 设置部分内存:memory.limit(60000)。所以假设你有 16GB RAM,那么 R 将使用 16GB RAM + 44GB 硬盘空间来执行你的代码。当 R 崩溃时,我正在使用它,因为 pc 缺少 RAM。也许这会让你的 R 在代码处理时不会崩溃。
  • 嗨。我已经在使用 memory.limit 函数了。无论如何,当数据集很大时,您没有足够的 SSD 磁盘。我想测量用于不同数据集大小的时间和内存。
  • 哦,好吧,即使我使用超过 8-10GB 的数据文件,它也对我有用。另外,是的,我明白你想做什么,我只是强硬的 memory.limit() 会让你的 R 不会崩溃。比我更擅长 R 的人可能会帮助您解决问题。

标签: r profiling benchmarking


【解决方案1】:

我为这样的基准测试做的一件事是启动另一个 R 实例并让另一个 R 实例将结果返回到标准输出(或者更简单,只需将其保存为文件)。

例子:

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")

【讨论】: