多层与plyr,MC

时间:2012-03-21 16:10:43

标签: r parallel-processing plyr mc

您好我正在尝试使用ddply包中的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 

有什么想法吗?

2 个答案:

答案 0 :(得分:10)

相对于将拆分部分分配到每个核心并检索结果所需的通信成本,mean函数的运行速度过快。

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

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

答案 1 :(得分: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)

这个可能可以帮助您,因为我们现在正在以分布式方式执行拆分组合例程。这适用于分割大小相同的情况,它适用于总和,最小/最大,计数等都可以,但有一些操作我们不能用它。