2016-09-19 29 views
0

foreach-doparと並列化したい長いジョブがたくさんあるので、各スレッドは他のスレッドとは独立した仕事をします。 sinkを使用してログファイルに書き込むことで、各スレッドの状態を追跡したいものもあれば、失敗したものもあります。以下は明らかに機能しません。ログファイルには1つのエントリしかありません。何が悪かったのかR foreachスレッドを同じログファイルに書き込む方法

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

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") 

ログファイルは1行だけ持っていますか?私は本当に複数のプロセスが同じファイルへの書き込みを持つ信頼していないが、

答えて

3

、あなたがappend=TRUEオプション使用して成功を持っていることがあります。このオプションを設定せずに

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

を、catは、以前の内容を上書きします」 mylog.txt "と呼びます。他のアプローチのために

、欠けている正確に何がmy answer here.

+0

を参照してください! – horaceT

関連する問題