当数据仅包含在一个列表或矩阵中时,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()之前拆分列表,只将相关矩阵发送到每个节点进行处理?
答案 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中。顺便说一句,还有一个mclapply
是lapply
的多核版本。
因此,mcmapply
和mclapply
是您可能希望称为parMapply
和parLapply
的最简单版本。