第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么并行包慢于使用apply?

為什么并行包慢于使用apply?

紫衣仙女 2019-08-13 14:18:22
為什么并行包慢于使用apply?我正在嘗試確定何時使用該parallel軟件包來加快運行某些分析所需的時間。我需要做的一件事是創(chuàng)建矩陣,比較具有不同行數(shù)的兩個數(shù)據(jù)幀中的變量。我問了一個關(guān)于在StackOverflow上做有效方法的問題,并在我的博客上寫了關(guān)于測試的文章。由于我對最佳方法感到滿意,因此我希望通過并行運行來加快這一過程。以下結(jié)果基于帶有8GB RAM的2ghz i7 Mac。令我感到驚訝的是,特別是功能parallel包parSapply比使用該apply功能更糟糕。復(fù)制它的代碼如下。請注意,我目前只使用我創(chuàng)建的兩個列中的一個,但最終想要同時使用它們。執(zhí)行時間http://jason.bryer.org/images/ParalleVsApplyTiming.pngrequire(parallel)require(ggplot2)require(reshape2)set.seed(2112)results <- list()sizes <- seq(1000, 30000, by=5000)pb <- txtProgressBar(min=0, max=length(sizes), style=3)for(cnt in 1:length(sizes)) {     i <- sizes[cnt]     df1 <- data.frame(row.names=1:i,                        var1=sample(c(TRUE,FALSE), i, replace=TRUE),                        var2=sample(1:10, i, replace=TRUE) )     df2 <- data.frame(row.names=(i + 1):(i + i),                        var1=sample(c(TRUE,FALSE), i, replace=TRUE),                       var2=sample(1:10, i, replace=TRUE))     tm1 <- system.time({         df6 <- sapply(df2$var1, FUN=function(x) { x == df1$var1 })         dimnames(df6) <- list(row.names(df1), row.names(df2))     })     rm(df6)     tm2 <- system.time({         cl <- makeCluster(getOption('cl.cores', detectCores()))         tm3 <- system.time({             df7 <- parSapply(cl, df1$var1, FUN=function(x, df2) { x == df2$var1 }, df2=df2)             dimnames(df7) <- list(row.names(df1), row.names(df2))         })         stopCluster(cl)     })     rm(df7)     results[[cnt]] <- c(apply=tm1, parallel.total=tm2, parallel.exec=tm3)     setTxtProgressBar(pb, cnt)}toplot <- as.data.frame(results)[,c('apply.user.self','parallel.total.user.self',                           'parallel.exec.user.self')]toplot$size <- sizes toplot <- melt(toplot, id='size')ggplot(toplot, aes(x=size, y=value, colour=variable)) + geom_line() +      xlab('Vector Size') + ylab('Time (seconds)')
查看完整描述

3 回答

?
翻翻過去那場雪

TA貢獻(xiàn)2065條經(jīng)驗 獲得超14個贊

并行運行工作會產(chǎn)生開銷。只有當(dāng)您在工作節(jié)點上觸發(fā)的作業(yè)花費大量時間時,并行化才能提高整體性能。當(dāng)單個作業(yè)只需幾毫秒時,不斷解雇作業(yè)的開銷將降低整體性能。訣竅是在節(jié)點上劃分工作,使作業(yè)足夠長,比如說至少幾秒鐘。我使用它可以同時運行六個Fortran模型,但是這些單獨的模型運行需要幾個小時,幾乎可以消除開銷的影響。

請注意,我沒有運行您的示例,但是當(dāng)parallization比順序運行花費更長時間時,我上面描述的情況通常是個問題。


查看完整回答
反對 回復(fù) 2019-08-13
?
當(dāng)年話下

TA貢獻(xiàn)1890條經(jīng)驗 獲得超9個贊

這些差異可歸因于1)通信開銷(特別是如果跨節(jié)點運行)和2)性能開銷(例如,與啟動并行化相比,您的工作不是那么密集)。通常,如果您正在并行化的任務(wù)并不那么耗時,那么您將發(fā)現(xiàn)并行化并沒有太大的影響(這在大型數(shù)據(jù)集中非常明顯。


即使這可能不能直接回答您的基準(zhǔn)測試,但我希望這應(yīng)該是相當(dāng)簡單的并且可以與之相關(guān)。作為一個例子,在這里,我建立一個data.frame與1e6具有行1e4唯一的列g(shù)roup項,并在列中的某些值val。然后我plyr在parallel使用doMC和不使用并行化時運行。


df <- data.frame(group = as.factor(sample(1:1e4, 1e6, replace = T)), 

                 val = sample(1:10, 1e6, replace = T))

> head(df)

  group val

# 1  8498   8

# 2  5253   6

# 3  1495   1

# 4  7362   9

# 5  2344   6

# 6  5602   9


> dim(df)

# [1] 1000000       2


require(plyr)

require(doMC)

registerDoMC(20) # 20 processors


# parallelisation using doMC + plyr 

P.PLYR <- function() {

    o1 <- ddply(df, .(group), function(x) sum(x$val), .parallel = TRUE)

}


# no parallelisation

PLYR <- function() {

    o2 <- ddply(df, .(group), function(x) sum(x$val), .parallel = FALSE)

}


require(rbenchmark)

benchmark(P.PLYR(), PLYR(), replications = 2, order = "elapsed")


      test replications elapsed relative user.self sys.self user.child sys.child

2   PLYR()            2   8.925    1.000     8.865    0.068      0.000     0.000

1 P.PLYR()            2  30.637    3.433    15.841   13.945      8.944    38.858

正如您所看到的,并行版本的plyr運行速度慢了3.5倍


現(xiàn)在,讓我使用相同的data.frame,但不是計算sum,讓我構(gòu)建一個更苛刻的功能,比如說median(.) * median(rnorm(1e4)((無意義,是的):


你會看到潮汐開始轉(zhuǎn)變:


# parallelisation using doMC + plyr 

P.PLYR <- function() {

    o1 <- ddply(df, .(group), function(x) 

      median(x$val) * median(rnorm(1e4)), .parallel = TRUE)

}


# no parallelisation

PLYR <- function() {

    o2 <- ddply(df, .(group), function(x) 

         median(x$val) * median(rnorm(1e4)), .parallel = FALSE)

}


> benchmark(P.PLYR(), PLYR(), replications = 2, order = "elapsed")

      test replications elapsed relative user.self sys.self user.child sys.child

1 P.PLYR()            2  41.911    1.000    15.265   15.369    141.585    34.254

2   PLYR()            2  73.417    1.752    73.372    0.052      0.000     0.000

這里,并行版本比非并行版本1.752 times 更快。


編輯:關(guān)注 @Paul的評論,我剛剛實施了一個小延遲Sys.sleep()。當(dāng)然結(jié)果很明顯。但僅僅為了完整起見,這是20 * 2 data.frame的結(jié)果:


df <- data.frame(group=sample(letters[1:5], 20, replace=T), val=sample(20))


# parallelisation using doMC + plyr 

P.PLYR <- function() {

    o1 <- ddply(df, .(group), function(x) {

    Sys.sleep(2)

    median(x$val)

    }, .parallel = TRUE)

}


# no parallelisation

PLYR <- function() {

    o2 <- ddply(df, .(group), function(x) {

        Sys.sleep(2)

        median(x$val)

    }, .parallel = FALSE)

}


> benchmark(P.PLYR(), PLYR(), replications = 2, order = "elapsed")


#       test replications elapsed relative user.self sys.self user.child sys.child

# 1 P.PLYR()            2   4.116    1.000     0.056    0.056      0.024      0.04

# 2   PLYR()            2  20.050    4.871     0.028    0.000      0.000      0.00

這里的差異并不令人驚訝。


查看完整回答
反對 回復(fù) 2019-08-13
  • 3 回答
  • 0 關(guān)注
  • 806 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號