在雪群上分发列表

时间:2012-05-11 16:20:51

标签: r parallel-processing lapply

当数据仅包含在一个列表或矩阵中时,snow package parXapply()函数可以很好地分配工作,但在这种情况下,我需要在四种不同类型的矩阵上运行函数。

例如,这就是我现在所拥有的:

res.list = parLapply(cl, mynames, myfun, listA, listB, listC, listD)

myfun = function(name, listA, listB, listC, listD) {
  matrixA = listA[[name]]
  matrixB = listB[[name]]
  matrixC = listC[[name]]
  matrixD = listD[[name]]
}

我遇到的问题是矩阵非常大,我怀疑在完整列表上调用parLapply()涉及将所有数据传输到每个群集节点。这可能非常耗时并且会降低集群性能。

如何在调用myfun()之前拆分列表,只将相关矩阵发送到每个节点进行处理?

2 个答案:

答案 0 :(得分:4)

clusterMap()完成工作:

res.list = clusterMap(cl, myfun, mynames, listA, listB, listC, listD)

不知何故,parMapply()包装器被排除在包外。

答案 1 :(得分:0)

我认为Robert Kubrick给出的答案最好使用clusterMap回答这个问题。但是,我认为搜索相关问题答案的其他人可能会从另一个选项中受益 - mcmapply(这是mapply的多核版本)。例如:

mcmapply(rep, 1:4, 4:1)

mcmapply使用forking实现并行mapply,这意味着不是Windows机器上的选项。此外,如果您运行R,可能会出现并发症在GUI中。顺便说一句,还有一个mclapplylapply的多核版本。

因此,mcmapplymclapply是您可能希望称为parMapplyparLapply的最简单版本。