为什么并行包慢于使用apply?
我正在尝试确定何时使用该parallel
软件包来加快运行某些分析所需的时间。我需要做的一件事是创建矩阵,比较具有不同行数的两个数据帧中的变量。我问了一个关于在StackOverflow上做有效方法的问题,并在我的博客上写了关于测试的文章。由于我对最佳方法感到满意,因此我希望通过并行运行来加快这一过程。以下结果基于带有8GB RAM的2ghz i7 Mac。令我感到惊讶的是,特别是功能parallel
包parSapply
比使用该apply
功能更糟糕。复制它的代码如下。请注意,我目前只使用我创建的两个列中的一个,但最终想要同时使用它们。
执行时间http://jason.bryer.org/images/ParalleVsApplyTiming.png
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)')
翻翻过去那场雪
当年话下