当数据只包含在一个列表或矩阵中时,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]]
}我遇到的问题是矩阵非常大,我怀疑在完整列表上调用parLapply()会将所有数据传输到每个集群节点。这可能非常耗时,并会降低群集性能。
如何在调用myfun()之前拆分列表,并只将相关矩阵发送到每个节点进行处理?
发布于 2012-05-12 03:48:54
clusterMap()完成这项工作:
res.list = clusterMap(cl, myfun, mynames, listA, listB, listC, listD)不知何故,parMapply()包装器被遗漏在包中。
发布于 2014-08-13 06:37:24
我认为罗伯特·库布里克给出的答案是使用clusterMap最好地回答了这个问题。但是,我认为其他搜索相关问题答案的人可能会从另一个选择中受益-- mcmapply (它是mapply的多核版本)。例如:
mcmapply(rep, 1:4, 4:1)mcmapply使用forking实现了一个并行的图形用户界面( mapply ),这意味着它是,而不是Windows机器上的选项。顺便说一下,还有一个mclapply,它是lapply的多核版本。
因此,mcmapply和mclapply是您所期望的parMapply和parLapply的最简单版本。
https://stackoverflow.com/questions/10555106
复制相似问题