Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
r双并行qbeta与RcppParallel-如何在满容量下使用内核_R_Rcpp_Doparallel - Fatal编程技术网

r双并行qbeta与RcppParallel-如何在满容量下使用内核

r双并行qbeta与RcppParallel-如何在满容量下使用内核,r,rcpp,doparallel,R,Rcpp,Doparallel,我运行下面的示例代码来模拟这些值,下面是4个内核使用情况的快照。在满容量下使用所有内核需要一段时间,我想了解发生了什么,以及最终如何使其更快 library(doParallel) library(data.table) data<-data.table(a=runif(10000000),b=runif(10000000),quantile=runif(10000000)) e <- nrow(data)%/%1000000+1 dataSplit<-split(dat

我运行下面的示例代码来模拟这些值,下面是4个内核使用情况的快照。在满容量下使用所有内核需要一段时间,我想了解发生了什么,以及最终如何使其更快

library(doParallel)
library(data.table)

data<-data.table(a=runif(10000000),b=runif(10000000),quantile=runif(10000000))

e <- nrow(data)%/%1000000+1 
dataSplit<-split(data[],seq_len(nrow(data))%/%1000000)
qbetaVec<-function(lossvalues) qbeta(lossvalues$quantile,lossvalues$a,lossvalues$b)

cl <- makeCluster(4)
registerDoParallel(cl)
res2<-foreach(i=1:e) %dopar% qbetaVec(dataSplit[[i]])
res3<-unlist(res2)
库(双并行)
库(数据表)

数据并行化涉及开销,尤其是与工人之间的数据传输。此外,如果您只使用四个工人,并且每个任务所需的时间大致相同,那么将其拆分为四个以上的任务是没有意义的

library(microbenchmark)

microbenchmark(
  OP = {
    e <- nrow(data)%/%1000000+1 
    dataSplit<-split(data[],seq_len(nrow(data))%/%1000000)
    qbetaVec<-function(lossvalues) qbeta(lossvalues$quantile,lossvalues$a,lossvalues$b)

    cl <- makeCluster(4)
    registerDoParallel(cl)
    res2<-foreach(i=1:e) %dopar% qbetaVec(dataSplit[[i]])
    res3<-unlist(res2)
    stopCluster(cl)
  },
  OP_4split = {
    e <- 4 
    dataSplit<-split(data[],seq_len(nrow(data)) %% e) #note this change
    qbetaVec<-function(lossvalues) qbeta(lossvalues$quantile,lossvalues$a,lossvalues$b)

    cl <- makeCluster(e)
    registerDoParallel(cl)
    res2<-foreach(i=1:e) %dopar% qbetaVec(dataSplit[[i]])
    res3<-unlist(res2)
    stopCluster(cl)
  },
  serial = {
    res3 <- data[, qbeta(quantile, a, b)]
  },
  times = 3
)

#Unit: seconds
#      expr      min       lq     mean   median       uq      max neval
#        OP 17.31950 17.35962 17.37491 17.39975 17.40262 17.40549     3
# OP_4split 15.98415 16.03414 16.10776 16.08413 16.16957 16.25500     3
#    serial 22.62642 22.64165 22.66247 22.65689 22.68050 22.70411     3
库(微基准)
微基准(
OP={

这是一个玩具的例子吗?因为你不需要并行化就可以使它更快。@Roland我自己使用qbeta,因为它是矢量化的,速度更快(大约2倍)。我想看看并行化是否可以进一步改进。谢谢你的投入。我可以问一下你使用什么处理器吗?它比时间快4倍。我也应该研究改进硬件。关于数据拆分,我尝试了这个方法,它节省了时间,但不确定:e@charliealphan i7-4790K@4.00GHz