2015-01-29 1 views
1

병렬로 실행하려는 프로세스와 진행률 표시 줄을 만드는 데 문제가 있습니다. 프로세스에 대한진행률 표시 줄과 프로세스를 병행으로 조합하십시오.

내 코드는 다음과 같습니다

pred_pnn <- function(x, nn){ 
    xlst <- split(x, 1:nrow(x)) 
    pred <- foreach(i = xlst,.packages = c('tcltk', 'foreach'), .combine = rbind) 
    %dopar% 
{ mypb <- tkProgressBar(title = "R progress bar", label = "", 
         min = 0, max = max(jSeq), initial = 0, width = 300) 
    foreach(j = jSeq) %do% {Sys.sleep(.1) 
    setTkProgressBar(mypb, j, title = "pb", label = NULL) 
    } 
    library(pnn) 
data.frame(prob = guess(nn, as.matrix(i))$probabilities[1], row.names = NULL) 
} 
} 

가 내 코드와 형태를 here

을 제공하지만, 컴파일되지 않은 하나를 결합했다. 구문 오류가 발생하지만 찾을 수 없습니다.

나는이 다른 코드 시도 :

pred_pnn <- function(x, nn){ 
    xlst <- split(x, 1:nrow(x)) 
    pred <- foreach(i = xlst, .combine = rbind) %dopar% 
{library(pnn) 
cat(i, '\n') 
data.frame(prob = guess(nn, as.matrix(i))$probabilities[1], row.names = NULL) 
} 
} 

을하지만 난 너무 오류가 발생합니다.

답변

2

사용하려는 접근법은 특정 상황에서 작동하지만 좋은 해결책이 아닙니다. 내가 뭘하고 싶은 마스터 프로세스 (foreach 루프 외부)의 진행률 표시 줄을 만들고 foreach 작업이 반환 될 때 해당 진행률을 업데이트 할 수 있습니다. 불행히도, 백엔드 중 어느 것도이를 지원하지 않습니다. 결합 함수를 사용하여이를 수행 할 수 있지만, 즉각적인 결합 함수 호출을 지원하는 백엔드 (doParallel, doSNOWdoMC은 지원하지 않음)를 사용하는 경우에만 가능합니다. 이러한 백엔드는 작업이 반환 될 때 사용자 제공 코드가 실행될 수 있도록 후크를 지원하지 않는 clusterApplyLBmclapply과 같은 함수를 사용하여 구현되기 때문에 결합을 즉시 호출하지 않습니다.

foreach에서 진행률 표시 줄 지원에 관심을 보았 기 때문에패키지를 수정하여 doSNOW 관련 "진행률"옵션에 대한 지원을 추가하고 코드를 R-Forge 웹 사이트에 체크인했습니다. 불행히도 parallel 패키지로 내보낼 수없는 snow 패키지의 하위 레벨 기능을 사용합니다.

이 새로운 기능을 시험해 보려면 R-Forge의 doSNOW을 설치해야합니다.

library(doSNOW) 
library(tcltk) 
cl <- makeSOCKcluster(3) 
registerDoSNOW(cl) 
pb <- tkProgressBar(max=100) 
progress <- function(n) setTkProgressBar(pb, n) 
opts <- list(progress=progress) 
r <- foreach(i=1:100, .options.snow=opts) %dopar% { 
    Sys.sleep(1) 
    sqrt(i) 
} 

업데이트

progress 옵션 : 여기

install.packages("doSNOW", repos="http://R-Forge.R-project.org", type="source") 

이 실험 '통해 진행 상태 "옵션을 보여주는 간단한 예제 스크립트입니다 : 내 맥북 프로 사용하여 명령에 이런 짓을 현재 CRAN의 doSNOW 최신 버전에서 사용할 수 있습니다.

관련 문제