Parallel loops 비교
parallel R – 병렬처리
속도와 메모리 제약
같은 혹은 다른 기계의 여러 R 프로세스가 하나의 일을 수행
loops
https://medium.com/@ambodi/performance-benchmarks-of-serial-and-parallel-loops-in-r-5a59e29051f9
3.1 GHz Quad-Core Intel Core i7, processor 1, Cores 4, detectCore 8, 16GB Macbook pro
library("tictoc") library("doParallel") no_cores <- detectCores() -2 library("furrr") options(future.fork.enable=TRUE) no_workers <- availableCores() -2 getPrimeNumbers <- function(n) { n <- as.integer(n) if(n > 1e6) stop("n too large") primes <- rep(TRUE, n) primes[1] <- FALSE last.prime <- 2L for(i in last.prime:floor(sqrt(n))){ primes[seq.int(2L*last.prime, n, last.prime)] <- FALSE last.prime <- last.prime + min(which(primes[(last.prime+1):n])) } which(primes) } resetResult <- function() { object.size(result) %>% print() # 26801480 bytes rm(list=c("result", "cl","i"), envir = .GlobalEnv) } index <- 10:10000 ######### lapply ######### tic() result <- lapply(index, function(x) getPrimeNumbers(x)) toc() resetResult() # 32.401 sec elapsed ######### map ######### tic() result <- index %>% map( ~ getPrimeNumbers(.x)) toc() resetResult() # 32.609 sec elapsed ######### for loop ######### tic() result <- c() for (i in index) {result[[i]] <- getPrimeNumbers(i) } toc() resetResult() # 31.875 sec elapsed ######### furrr ######### plan("multicore", workers=no_workers) tic() result <- index %>% future_map( ~ getPrimeNumbers(.x)) toc() plan("sequential") resetResult() # 16.515 sec elapsed ######### parLapply ######### registerDoParallel(cores=no_cores) cl <- makeCluster(no_cores, type="FORK") tic() result <- parLapply(cl, index, getPrimeNumbers) toc() stopCluster(cl) resetResult() # 16.092 sec elapsed ######### foreach ######### cl <- makeCluster(no_cores, type="FORK") registerDoParallel(cl) tic() result <- foreach(i=index) %dopar% getPrimeNumbers(i) toc() stopCluster(cl) resetResult() # 11.437 sec elapsed ######### mcapply ######### tic() result <- index %>% mclapply(getPrimeNumbers, mc.cores=no_cores) toc() resetResult() # 9.519 sec elapsed