2016-09-19 6 views
0

각 스레드가 다른 스레드와 독립적으로 작동하도록 foreach-dopar와 병렬 처리 할 긴 작업이 여러 개 있습니다. sink을 사용하여 로그 파일에 기록하여 각 스레드의 상태를 추적하려고합니다 (일부는 다른 스레드가 성공할 경우 실패 할 수 있습니다). 다음은 분명히 작동하지 않습니다. 로그 파일에는 하나의 항목 만 있습니다. 잘못된 무엇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") 

로그 파일은 하나 개의 라인을 가지고? 정말 여러 프로세스가 동일한 파일에 쓸 필요 신뢰하지 않지만

답변

3

, 당신은 append=TRUE 옵션을 사용하여 성공을 할 수 있습니다 :이 옵션을 설정하지 않고

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

cat은의 이전 내용을 덮어 쓰게됩니다 " mylog.txt "가 호출 될 때마다.

다른 접근 방법은 my answer here.

+0

정확히 무엇이 누락 되었습니까? – horaceT

관련 문제