【问题标题】:Is it possible to create a text log within a foreach() %dopar% call in R?是否可以在 R 中的 foreach() %dopar% 调用中创建文本日志?
【发布时间】:2020-04-17 19:05:21
【问题描述】:

我想在我的 R 脚本中将某些事件记录到 .txt 文件中。部分脚本是并行的。是否可以在并行化函数中使用 cat() 或类似函数记录事件?

这不起作用。


chunks <- list(1:3, 4:6)

foreach(i = 1:cores) %:%
  foreach(x = chunks[[i]]) %dopar% {
    cat("Working on chunk, ", i, "number ", x, "...\n\n")
  }

这可行,但它是系统特定的(不理想)

foreach(i = 1:cores, .packages = "glue") %:%
  foreach(x = chunks[[i]]) %dopar% {
    system(glue("echo 'Working on chunk {i}, number {x}' >> output.txt"))
  }

第二个(工作)代码块的示例输出:

Working on chunk 1, number 1
Working on chunk 1, number 2
Working on chunk 1, number 3
Working on chunk 2, number 4
Working on chunk 2, number 6
Working on chunk 2, number 5

【问题讨论】:

  • 这能回答你的问题吗? No standard output received inside foreach loop
  • @F.Privé 这看起来真的很棒而且非常封闭,但它会产生意想不到的后果。例如,当为每个线程加载包时 (.packages = c("package", "names") 我得到了每个线程的所有包加载文本,这真的是多余的!有什么提示吗?

标签: r foreach doparallel


【解决方案1】:

你可以在 R 中使用 doSNOW 包。你也可以指定你想要输出日志的文件。希望这对你有用。

library(doSNOW)

cl <- makeCluster(2, outfile = "abc.out")
registerDoSNOW(cl)

chunks <- list(1:3, 4:6)

foreach(i = 1:2) %:%
  foreach(x = chunks[[i]]) %dopar% {
    cat("Working on chunk, ", i, "number ", x, "...\n\n")
    print("ongoing")
    # your statements
  }

stopCluster(cl)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多