R 并行处理,并行运行时间比串行运行时间长得多

R 并行处理,并行运行时间比串行运行时间长得多,r,parallel-processing,bioconductor,R,Parallel Processing,Bioconductor,我正在尝试使用并行处理来加速在R中运行许多增强的回归树。我正在使用并行包()。我创建了一些虚拟数据,然后设置了一个函数来运行两个BRT模型,我希望先串行计时,然后并行计时。然而,我的并行运行似乎从未完成,而串行运行只需要大约3秒钟 ##CAN I USE PARALLEL PROCESSING TO SPEED UP BRT'S? ##LOAD PACKAGES library(BiocParallel) library(dismo) library(gbm) library(MASS) #

我正在尝试使用并行处理来加速在R中运行许多增强的回归树。我正在使用并行包()。我创建了一些虚拟数据,然后设置了一个函数来运行两个BRT模型,我希望先串行计时,然后并行计时。然而,我的并行运行似乎从未完成,而串行运行只需要大约3秒钟

##CAN I USE PARALLEL PROCESSING TO SPEED UP BRT'S?

##LOAD PACKAGES
library(BiocParallel)
library(dismo)
library(gbm)
library(MASS)

##CREATE RANDOM, CORRELATED DATA
## FROM https://www.r-bloggers.com/simulating-random-multivariate-correlated-data-continuous-variables/
R = matrix(cbind(1,.80,.2,  .80,1,.7,  .2,.7,1),nrow=3)
U = t(chol(R))
nvars = dim(U)[1]
numobs = 100
set.seed(1)
random.normal = matrix(rnorm(nvars*numobs,0,1), nrow=nvars, ncol=numobs);
X = U %*% random.normal
newX = t(X)
raw = as.data.frame(newX)
orig.raw = as.data.frame(t(random.normal))
names(raw) = c("response","predictor1","predictor2")
cor(raw)


###########################################################
##  MODEL
##########################################################


##WITH FUNCTIONS, 

Tc<-c(4, 8) ##Tree Complexities

Lr<-c(0.01)  ## Learning Rates

Vars <- split(expand.grid(Tc,Lr),seq(nrow(expand.grid(Tc,Lr))))

brt <- function(x){
  a <- gbm.step(raw,gbm.x=c(2:3),gbm.y="response",tree.complexity=x[1],learning.rate=x[2],bag.fraction=0.65, family="gaussian")
  b <- data.frame(model=paste("Tc= ",x[1]," _ ","Lr= ",x[2],sep=""), R2=a$cv.statistics$correlation.mean, Dev=a$cv.statistics$deviance.mean)
  ##Reassign model with unique name
  assign(paste("patch.tc",x[1],".lr",x[2],sep=""),a, envir = .GlobalEnv)
  assign(paste("RESULTS","patch.tc",x[1],".lr",x[2],sep=""),b, envir = .GlobalEnv)
  print(b)
}



############################
###IN Serial
############################

system.time(
lapply(Vars, brt)
)


############################
###IN PARALLEL
############################

system.time(
bplapply(Vars, brt)
)
##我可以使用并行处理来加速BRT吗?
##加载包
图书馆(平行)
图书馆(dismo)
图书馆(gbm)
图书馆(弥撒)
##创建随机的、相关的数据
##从https://www.r-bloggers.com/simulating-random-multivariate-correlated-data-continuous-variables/
R=矩阵(cbind(1,80,2,80,1,7,2,7,1),nrow=3)
U=t(chol(R))
nvars=尺寸(U)[1]
numobs=100
种子(1)
random.normal=矩阵(rnorm(nVAR*numobs,0,1),nrow=nVAR,ncol=numobs);
X=U%*%random.normal
newX=t(X)
raw=as.data.frame(newX)
原始数据=原始数据帧(t(随机正常))
名称(原始)=c(“响应”、“预测值1”、“预测值2”)
原材料
###########################################################
##模型
##########################################################
##有了功能,,
Tc一些快速评论:

  • 始终避免
    assign()
    ;如果你发现自己在使用它,这是一个很好的迹象,表明你正在以错误的方式处理问题

  • 从函数中向全局环境分配变量(使用
    Assign()
    一些快速注释:

  • 始终避免
    assign()
    ;如果您发现自己在使用它,这是一个很好的迹象,表明您正在以错误的方式处理问题


  • 从函数中向全局环境分配变量(使用
    Assign()
    感谢您花时间解释。您的#5肯定解决了错误。我在您的代码中没有看到返回?感谢您花时间解释。您的#5肯定解决了错误。我在您的代码中没有看到返回?
    
    brt <- function(x){
      a <- gbm.step(raw, gbm.x=c(2:3), gbm.y="response", tree.complexity=x[1], learning.rate=x[2], bag.fraction=0.65, family="gaussian", plot.main = FALSE)
      b <- data.frame(model=paste("Tc= ", x[1], " _ ", "Lr= ", x[2], sep=""), R2=a$cv.statistics$correlation.mean, Dev=a$cv.statistics$deviance.mean)
      list(a = a, b = b)
    }