gpt4 book ai didi

r - 为什么并行包比只使用apply 慢?

转载 作者:行者123 更新时间:2023-12-03 07:49:17 28 4
gpt4 key购买 nike

我正在尝试确定何时使用 parallel包以加快运行某些分析所需的时间。我需要做的一件事是创建矩阵,比较具有不同行数的两个数据框中的变量。我在 StackOverflow 上问了一个关于有效方法的问题并写了关于我的 blog 的测试.由于我对最佳方法感到满意,因此我想通过并行运行来加速该过程。以下结果基于具有 8GB RAM 的 2GHz i7 Mac。我很惊讶parallel包,parSapply特别是功能,比仅使用 apply 更糟糕功能。复制此代码的代码如下。请注意,我目前仅使用我创建的两列之一,但最终想同时使用两者。

Execution Time
(来源:bryer.org)

require(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)')

最佳答案

并行运行作业会产生开销。只有当您在工作节点上触发的作业花费大量时间时,并行化才能提高整体性能。当单个作业只需要几毫秒时,不断触发作业的开销会降低整体性能。诀窍是在节点上划分工作,使作业足够长,比如至少几秒钟。我用它同时运行六个 Fortran 模型效果很好,但是这些单独的模型运行需要几个小时,几乎抵消了开销的影响。

请注意,我没有运行您的示例,但是我上面描述的情况通常是并行化比顺序运行花费的时间更长的问题。

关于r - 为什么并行包比只使用apply 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14614306/

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