2016-09-19 58 views
0

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

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...... 

出了什么问题?

回答

3

虽然我真的不相信有多个进程写同一个文件,你可以通过使用append=TRUE选项有成功:

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

没有设置这个选项,cat将覆盖以前的内容“ mylog.txt“每次被调用。

对于其他方法,请参见my answer here.

+0

这正是缺少的! – horaceT