gpt4 book ai didi

r - mclapply() 的性能明显比 lapply() 差。我怎样才能加快速度?

转载 作者:行者123 更新时间:2023-12-04 01:47:32 33 4
gpt4 key购买 nike

我是 R 中并行计算的新手,想使用并行包来加速我的计算(这比下面的示例更复杂)。但是,与通常的 lapply 函数相比,使用 mclapply 函数的计算时间更长。

我在我的笔记本电脑上安装了一个全新的 Ubuntu 18.04.2 LTS,它有 7.7 GB 内存和一个 Intel® Core™ i7-4500U CPU @ 1.80GHz × 4 处理器。我在 R studio 上运行 R。

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 的结果快很多:
 > time_mclapply
user system elapsed
6.030 439.112 148.088
> time_lapply
user system elapsed
1.662 0.165 1.827

为什么我得到这个结果?是因为我的设置还是常见问题?
我怎样才能得到比 lapply 结果更快的结果,所以整个事情会更快?

更新:
嵌套循环的两个剩余组合的更新:
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

这给了我们
>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

在另一次运行中我得到了(所以运行时间似乎变化很大,有没有更好的方式来显示它们?)
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

最佳答案

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

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

  • 使用 N/2 ( mc.cores = parallel::detectCores() / 2 ) 时, time_mclapply_OUTtime_lapply 的两倍.

    关于r - mclapply() 的性能明显比 lapply() 差。我怎样才能加快速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54649608/

    33 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com