首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mclapply()的执行情况比lapply()差得多。我怎样才能加快速度?

mclapply()的执行情况比lapply()差得多。我怎样才能加快速度?
EN

Stack Overflow用户
提问于 2019-02-12 11:56:03
回答 1查看 1.8K关注 0票数 4

我对R中的并行计算很陌生,我想使用并行包来加速我的计算(这比下面的例子要复杂得多)。然而,与通常的lapply函数相比,使用mclapply函数所需的计算时间要长得多。

我在笔记本电脑上安装了一个新的Ubuntu18.04.2LTS,内存为7.7GB,英特尔核心™i7-4500ucpu@ 1.80GHz×4处理器。我在R演播室里运行R。

代码语言:javascript
复制
require(parallel)

a <- seq(0, 1, length.out = 110) #data
b <-  seq(0, 1, length.out = 110)
c <- replicate(1000, sample(1:100,size=10), simplify=FALSE)

function_A <- function(i, j, k) { # some random function to examplify the problem
  i+ j * pmax(i-k,0) 
}

#running it with mclapply 
ptm_mc <- proc.time()  
output <- mclapply(1:NROW(c), function(o){ 
  mclapply(1:NROW(a),function(p) function_A(a[p], b, c[[o]]))})
time_mclapply <- proc.time() - ptm_mc

# running it with lapply
ptm_lapply <- proc.time()  
output <- lapply(1:NROW(c), function(o){
  lapply(1:NROW(a),function(p) function_A(a[p], b, c[[o]]))})
time_lapply <- proc.time() - ptm_lapply

lapply的结果比mclapply结果快得多:

代码语言:javascript
复制
 > time_mclapply
       user      system     elapsed 
      6.030     439.112     148.088 
 > time_lapply
       user      system     elapsed 
      1.662       0.165       1.827 

我为什么要得到这个结果?是因为我的设置还是一个常见的问题?我怎样才能得到比应用结果更快的结果,所以整个过程会更快?

UPDATE:对其余两个嵌套循环组合的更新:

代码语言:javascript
复制
ptm_mc_OUT <- proc.time()  
output <- mclapply(1:NROW(c), function(o){
  lapply(1:NROW(a),function(p) function_A(a[p], b, c[[o]]))})
 time_mclapply_OUT <- proc.time() - ptm_mc_OUT

ptm_mc_IN <- proc.time()  
output <- lapply(1:NROW(c), function(o){
  mclapply(1:NROW(a),function(p) function_A(a[p], b, c[[o]]))})
time_mclapply_IN <- proc.time() - ptm_mc_IN

 require(dplyr)
times <- rbind(time_mclapply,
                      time_lapply,
                      time_mclapply_OUT, 
                      time_mclapply_IN) %>% data.frame()

times

这给了我们

代码语言:javascript
复制
>times
                  user.self sys.self elapsed user.child sys.child
time_mclapply         0.075    0.081  22.621      1.933    34.266
time_lapply           1.070    0.049   1.118      0.000     0.000
time_mclapply_OUT     0.064    0.077   0.884      2.539    34.587
time_mclapply_IN      1.329   31.843  37.426      5.108    28.879

在另一次运行中,我得到了(因此运行时间似乎有相当大的变化,有没有更好的方法来显示它们?)

代码语言:javascript
复制
times_lapply
                   user.self sys.self elapsed user.child sys.child
time_mclapply         0.324    0.121   9.108      0.000     0.000
time_lapply           1.060    0.049   1.108      0.000     0.000
time_mclapply_OUT     0.211    0.092   1.155     10.791    19.632
time_mclapply_IN      1.221   22.196  27.089      5.130    23.032
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-12 16:30:08

设N是机器的线程数。一些建议:

  1. 您不应该使用两级并行性,因为您将使用N^2线程。
  2. 您应该尝试在外部循环而不是内部循环中并行化(因为并行的开销只会发生一次)。
  3. 您不应该使用所有线程(人们通常使用N1或N/2)。

当使用N/2 (mc.cores = parallel::detectCores() / 2)时,time_mclapply_OUT的速度是time_lapply的两倍。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54649608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档