【问题标题】:Distributing lists on a snow cluster在雪簇上分发列表
【发布时间】:2012-05-11 16:20:51
【问题描述】:

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

【问题讨论】:

  • 看起来 mapply() 是我需要的,但它在雪中不可用。

标签: r parallel-processing lapply


【解决方案1】:

clusterMap() 完成这项工作:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    所以mcmapplymclapply 是您可能期望称为parMapplyparLapply 的最简单版本。

    【讨论】:

      猜你喜欢
      • 2018-04-17
      • 1970-01-01
      • 1970-01-01
      • 2019-07-23
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      • 2014-02-20
      相关资源
      最近更新 更多