如何使R foreach线程写入相同的日志文件

时间:2016-09-19 17:00:18

标签: r foreach parallel-processing logfile sink

我有许多冗长的工作,我想与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......

出了什么问题?

2 个答案:

答案 0 :(得分:3)

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

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

如果不设置此选项,cat将覆盖&#34; mylog.txt&#34;的前一内容。每次被召唤。

有关其他方法,请参阅my answer here.

答案 1 :(得分:1)

您也可以使用参数makeCluster来呼叫outfile。来自documentatino,outfile

  

从哪里引导工作者的stdout和stderr连接输出。 &#34;&#34;表示没有重定向(这可能仅对本地计算机上的工作人员有用)。默认为'/ dev / null'(Windows上为'nul:')。另一种可能性是工作者主机上的文件路径。文件将以追加模式打开,因为所有工作人员都会登录到同一个文件。