【问题标题】:Write output of R loop to output file or indicate progress?将R循环的输出写入输出文件或指示进度?
【发布时间】:2021-08-03 08:18:59
【问题描述】:

我在 R 中运行了一个相当复杂的循环,大约需要 20-30 天才能运行。循环的细节可能不太相关(维特比算法解码最可能的状态序列以对隐藏马尔可夫模型的输出进行后处理)。到目前为止,一旦它连续完成所有循环,我就将结果写入数据文件。

saveRDS(z_star, file = "z_star.Rda")

但是,这非常令人沮丧,因为我看不到循环已经完成了多远,而且我担心最终可能会发生破坏所有计算进度的事情(例如,生成的数据帧可能大于我正在使用的服务器的 RAM)。

我的问题是我是否应该 1) 在每个循环中写入输出文件,或者 2) 实现某种进度跟踪。对于这两个选项,我对如何实现它没有具体的想法,因此非常感谢代码。

N_draws = 2000
N = 100000
z_star = matrix(nrow = N_draws, ncol = N)
best_logp = data.frame(matrix(nrow = N, ncol = S))
back_ptr = best_logp


for(d in 1:N_draws){
  for (k in 1:K)
    best_logp[1, k] = dnorm(y[1],
                            mean = mu[k],
                            sd = sigma_q[d],
                            log = TRUE)
  for (t in 2:N) {
    for (k in 1:K) {
      best_logp[t, k] = -Inf
      for (j in 1:K) {
        real logp;
        logp = best_logp[t-1, j] + log(theta[j, k]) + dnorm(y[t],
                                                            mean = mu[k],
                                                            sd = sigma_q[d],
                                                            log = TRUE)
        if (logp > best_logp[t, k]) {
          back_ptr[t, k] = j;
          best_logp[t, k] = logp;
        }
      }
    }
  }
  log_p_z_star = max(best_logp[N]);
  for (k in 1:K)
    if (best_logp[N, k] == log_p_z_star)
      z_star[N] = k;
  for (t in 1:(N - 1))
    z_star[N - t] = back_ptr[N - t + 1, z_star[N - t + 1]];
}

【问题讨论】:

  • 添加进度指示器似乎是明智的。没有什么比等待并且不知道它是失败还是仍在处理更糟糕的了。选项包括用于缩短周期时间的“进度”包,但随着时间的推移,如何推送消息,例如使用“pocketapi”?
  • 还有两个想法,如果您可以存储中间文件,例如来自K in 1:K 循环,那么如果它失败或在下一次运行中,您可能可以跳过一些处理。最后,如果您可以功能化您的代码,它可能会提供性能、稳定性和速度优势。

标签: r loops save output progress-bar


【解决方案1】:

感谢您的想法,我决定做一些简单的事情:

我用索引和系统时间来表示进度使用

for(d in 1:N_draws){
  old <- Sys.time()
  cat(c("draw", d, "out of", N_draws, "\n"))

在最后一个括号关闭之前

  new = Sys.time() - old
  cat(c("time for draw", d, ":", new, "seconds", "\n"))
  percentage_completed = d/N_draws * 100
  cat(c("percentage completed:", percentage_completed, "percent", "\n"))
    }

返回

draw 1 out of 2000 
time for draw 1 : 0.839755058288574 seconds 
percentage completed: 0.05 percent 
draw 2 out of 2000 
time for draw 2 : 0.735047101974487 seconds 
percentage completed: 0.1 percent 
draw 3 out of 2000 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 2020-08-08
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    相关资源
    最近更新 更多