doParallel
Packages
#install.packages("doParallel")
library("doParallel")## Loading required package: foreach## Loading required package: iterators## Loading required package: parallelCheck how long a loop takes
start <- proc.time()
for (i in 1:10){
sqrt(i)
}
base_loop=(proc.time()-start)Check number of cores
library("doParallel")
detectCores()## [1] 8getDoParWorkers() #current number of worker## [1] 1registerDoSEQ() #switch back to original
getDoParWorkers()## [1] 1Let R know how many cores you want to use
registerDoParallel(6)Note: You shouldn’t use all the cores since your computer might want some background programs to run.
We can also create cluster of workers
cluster = makeCluster(2)
registerDoParallel(cluster)
system.time(foreach(i=1:100) %dopar% sum((1:i)))## user system elapsed
## 0.03 0.00 0.04stopCluster(cluster)Compare different loops
%do%
start <- proc.time()
foreach(i=1:10) %do% {
sqrt(i)
}## [[1]]
## [1] 1
##
## [[2]]
## [1] 1.414214
##
## [[3]]
## [1] 1.732051
##
## [[4]]
## [1] 2
##
## [[5]]
## [1] 2.236068
##
## [[6]]
## [1] 2.44949
##
## [[7]]
## [1] 2.645751
##
## [[8]]
## [1] 2.828427
##
## [[9]]
## [1] 3
##
## [[10]]
## [1] 3.162278do_loop=(proc.time()-start)%dopar% loop
cl <- makeCluster(2)
registerDoParallel(cl)
start <- proc.time()
foreach(i = 1:10, .combine = 'c') %dopar% {
sqrt(i)
}## [1] 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490 2.645751 2.828427
## [9] 3.000000 3.162278dopar_loop=(proc.time()-start)
stopCluster(cl)print(rbind(base_loop,do_loop,dopar_loop)[,1:3])## user.self sys.self elapsed
## base_loop 0.01 0 0.02
## do_loop 0.02 0 0.01
## dopar_loop 0.02 0 0.04%do% does not use more than base core, but %dopar% uses the number of cores that we specify in registerDoParallel
doParallel::mclapply is the equivalent of lapply.