R 在snow群集上分发列表
当数据只包含在一个列表或矩阵中时,snow包parXapply()函数可以很好地分布,但在本例中,我需要在四种不同类型的矩阵上运行一个函数 例如,这就是我现在拥有的:R 在snow群集上分发列表,r,parallel-processing,lapply,R,Parallel Processing,Lapply,当数据只包含在一个列表或矩阵中时,snow包parXapply()函数可以很好地分布,但在本例中,我需要在四种不同类型的矩阵上运行一个函数 例如,这就是我现在拥有的: res.list = parLapply(cl, mynames, myfun, listA, listB, listC, listD) myfun = function(name, listA, listB, listC, listD) { matrixA = listA[[name]] matrixB = listB
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]]
}
我遇到的问题是矩阵非常大,我怀疑在完整列表上调用parlappy()需要将所有数据传输到每个集群节点。这可能非常耗时,并会降低集群性能
如何在调用myfun()之前拆分列表,并仅将相关矩阵发送到每个节点进行处理?clusterMap()执行以下操作:
res.list = clusterMap(cl, myfun, mynames, listA, listB, listC, listD)
不知何故,parmappy()包装被从包中遗漏了。我认为罗伯特·库布里克给出的答案最好用
clusterMap
来回答这个问题。但是,我认为其他搜索相关问题答案的人可能会受益于另一个选项--mcmapply
(这是mapply
的多核版本)。例如:
mcmapply(rep, 1:4, 4:1)
mcmapply
使用forking实现并行mapply
,这意味着它在Windows机器上不是一个选项。此外,如果在GUI中运行R,可能会有一些复杂情况。顺便说一下,还有一个mclappy
,它是lappy
的多核版本
因此,mcmappy
和mclappy
是最简单的版本,您可能会期望它被称为parmappy
,parlappy
,看起来mappy()是我所需要的,但在雪地里是不可用的。