2

当数据仅包含在一个列表或矩阵中时,雪包 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() 之前拆分列表并仅将相关矩阵发送到每个节点进行处理?

4

2 回答 2

5

clusterMap() 完成这项工作:

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

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

于 2012-05-11T19:48:53.950 回答
0

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

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

mcmapply使用分叉实现并行mapply,这意味着它不是 Windows 机器上的选项。此外,如果您在 GUI 中运行 R,可能会出现复杂情况。顺便说一句,还有一个mclapply就是多核版本lapply

所以mcmapplymclapply是你可能期望被称为parMapply和的最简单的版本parLapply

于 2014-08-12T22:37:24.003 回答