6

嗨,我正在尝试在 Rddply中的plyr库中使用MC包。它似乎并没有加快计算速度。这是我运行的代码:

require(doMC)
registerDoMC(4)
getDoParWorkers()
##> 4
test <- data.frame(x=1:10000, y=rep(c(1:20), 500))
system.time(ddply(test, "y", mean))
  # user  system elapsed 
  # 0.015   0.000   0.015
system.time(ddply(test, "y", mean, .parallel=TRUE))
  # user  system elapsed 
  # 223.062   2.825   1.093 

有任何想法吗?

4

2 回答 2

10

mean相对于将拆分部分分配到每个核心并检索结果所需的通信成本,该功能运行得太快。

这是人们在使用分布式计算时遇到的常见“问题”。他们希望它能让一切运行得更快,因为他们忘记了成本(节点之间的通信)和好处(使用多个内核)。

plyr 中特定于并行处理的东西:只有函数在多个内核上运行。拆分和组合仍然在单个核心上完成,因此您应用的函数必须非常计算密集才能看到并行使用 plyr 函数时的好处。

于 2012-03-21T16:19:43.253 回答
1

继续约书亚的回答,如果您想加快此操作,有一个修复程序。它受到 Map-reduce 思想的启发,不久前我在一个示例数据集上做了一个 POC。

我使用了降雪库——我相信你也可以使用 doMC。

# On my phone, please pardon typos/bugs

test <- data.frame(x=1:1000000, y=rep(c(1:20), 500))

testList = list()
testList[[1]] <- test[c(1:250000),]
testList[[2]] <- test[c(250001:500000),]
testList[[3]] <- test[c(500001:750000),]
testList[[4]] <- test[c(750001:1000000),]

# Write a function for the above - Need to find optimum number of splits

sfInit(parallel = TRUE, cpus=4)
sfCluster(plyr)
meanList = sfClusterSpplyLB(testList, function(x) ddply(test, "y", mean))

sfStop()

aggregate(meanList, by=list(y), FUN=mean)

鉴于我们现在正在以分布式方式执行拆分组合例程,这可能会对您有所帮助。这适用于当拆分的大小相同时,它适用于总和、最小值/最大值、计数等,但有些操作我们不能使用它。

于 2013-03-08T07:17:35.647 回答