foreachとoptpar でRプログロラムを並列化

foreachとoptpar でRプログロラムを並列化

16CPUを使う場合 エラーが出る場合はoutfile=""を消去するとうまくいく場合も

library(parallel)
library(foreach)
library(doParallel)

x<-1:100
y<-1:100

v<-list(x,y)


slow_square = function(x) {
  Sys.sleep(0.5)
  print(x * x)
  return(x * x)
}

#foreach(x = seq(1, 30), .combine = c) %do% {
#  slow_square(x)
#}
#cl = makeCluster(getOption("mc.cores", 2L), type = "FORK",outfile="")

cores <- detectCores()
#cl<-makeCluster(cores,type="PSOCK",outfile="")

cl<-makeCluster(16,type="PSOCK",outfile="")
vvv<-NULL
clusterEvalQ(cl,{
  #library(randomForest)
  #library(kernlab)
  #data(spam)
  #(vvv)
  })
vvv<-NULL
registerDoParallel(cl)
#vvv<-foreach(x = seq(1, 30), .combine = c) %dopar% {
#  slow_square(x)
#}

v<-c(3,2,3)
vvv<-foreach(x = seq(1, 30), .combine = rbind,.multicombine
=FALSE) %dopar% {
  a<-list(v,x,slow_square(x))
  a
}

stopCluster(cl)

途中結果を表示される場合

  ff=file(out_file,"w")
        close(ff)

 vvv<-foreach(x = seq(1, 30), .combine = rbind,.multicombine
=FALSE) %dopar% {
  a<-list(v,x,slow_square(x))
 
                 ff=file(out_file,"a")

                cat(x,"\n",file=ff)
  a
}