더북(TheBook)

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)
+ }
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.