R 在snow群集上分发列表

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

当数据只包含在一个列表或矩阵中时,snow包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]]
}
我遇到的问题是矩阵非常大,我怀疑在完整列表上调用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()是我所需要的,但在雪地里是不可用的。