【问题标题】:How to make R foreach threads write to same log file如何使 R foreach 线程写入相同的日志文件
【发布时间】:2017-01-27 10:49:11
【问题描述】:

我有许多冗长的作业,我想与 foreach-dopar 并行化,以便每个线程独立于其他线程工作。我想通过使用sink 写入日志文件来跟踪每个线程的状态(一些可能会失败,而另一些会成功)。以下显然不起作用;日志文件只有一个条目。

library(foreach)
library(doParallel)
library(doSNOW)

cl = makeCluster(2, type="SOCK")
registerDoSNOW(cl)
dl = file("runlog.Rout", open="wt")
sink(dl, type="output",  append=TRUE)
sink(dl, type="message", append=TRUE)
dump <- foreach(i=1:5, 
            .errorhandling = "stop",
            .verbose=TRUE) %dopar% 
{
    beg.time = Sys.time()
    cat(as.character(beg.time), " I am running....\n", file="mylog.txt")
    # do something here.....
    end.time = Sys.time()
    del.tm = difftime(end.time, beg.time, units="mins")  
    cat("....saving output to file......\n\n", file="mylog.txt")
    save(del.tm, file = paste("I:/Rhome/H", i, ".RData", sep=""))
    return(i)
}
stopCluster(cl)
sink(type="output")
sink(type="message")

日志文件只有一行:

....saving output to file......

出了什么问题?

【问题讨论】:

    标签: r foreach parallel-processing logfile sink


    【解决方案1】:

    您也可以使用参数outfile 调用makeCluster。从文档中,outfile

    将工作人员的 stdout 和 stderr 连接输出定向到何处。 "" 表示没有重定向(这可能只对本地机器上的工作人员有用)。默认为“/dev/null”(Windows 上为“nul:”)。另一种可能性是工作人员主机上的文件路径。文件将以追加模式打开,因为所有工作人员都登录到同一个文件。

    【讨论】:

      【解决方案2】:

      虽然我不太相信让多个进程写入同一个文件,但使用append=TRUE 选项可能会成功:

      cat("...\n", file="mylog.txt", append=TRUE)
      

      如果不设置此选项,cat 将在每次调用“mylog.txt”时覆盖之前的内容。

      其他方法见my answer here.

      【讨论】:

      • 这正是缺少的!
      • 能否详细说明多个进程写入同一个文件的问题?您认为这会导致文件中出现意外输出,甚至导致运行崩溃吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 2014-07-02
      • 1970-01-01
      • 2018-07-29
      • 2013-11-26
      相关资源
      最近更新 更多