foreach의 병렬화
앞에서 foreach( ) 함수에는 %do%를 사용해 실행할 명령의 블록을 지정해야 한다고 설명했다. 만약 foreach( )에서 블록 내 명령을 병렬로 수행하고자 한다면 registerDoParallel( )을 한 뒤 foreach( )에 %do% 대신 %dopar%를 지정하면 된다.
예를 들어, 다음은 i 값이 1부터 800,000까지 변할 때 이 값을 big_data$value에 더한 다음 그 평균을 매 i마다 계산한 예다.
> library(doParallel) > library(foreach) > registerDoParallel(cores=4) > big_data <- data.frame( + value=runif(NROW(LETTERS) * 2000000), + group=rep(LETTERS, 2000000)) > foreach(i=1:800000) %dopar% { + mean(big_data$value + i) + }
이 예에서는 설명을 위해 다소 작위적인 코드를 작성했다. 좀 더 실제적인 적용 사례로는 다양한 파라미터에 따라 모델을 만들어보면서 가장 적절한 파라미터를 찾는 예를 들 수 있다. 예를 들어, 다수의 의사 결정 나무decision tree를 가진 랜덤 포레스트Random Forest 모델을 만들 때 적절한 나무 개수를 설정하기 위해 다양한 나무의 수를 사용해보는 경우[11]를 들 수 있다. 다음은 이를 의사 코드pseudo code로 표현한 것이다.
> foreach(ntree=c(10, 20, 30, 100, 1000)) %dopar% { + build_model(big_data, ntree=ntree) + }