2016-09-19 54 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