0

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

什么地方出了错 ?

4

2 回答 2

3

虽然我不太相信有多个进程写入同一个文件,但您可能会通过使用以下append=TRUE选项获得成功:

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

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

对于其他方法,请参阅我的答案here。

于 2016-09-20T21:32:37.937 回答
1

您也可以makeCluster使用参数调用outfile。从documentatino,outfile

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

于 2018-05-18T15:10:34.797 回答