【问题标题】:Parallel processing using "parallel" in R在 R 中使用“并行”进行并行处理
【发布时间】:2018-04-05 13:28:55
【问题描述】:

我有我正在上传的 R 数据表(具有多列的 .csv 格式),需要应用某些用户定义的规则(另一个 .csv 格式的文件,其中每一行定义一个规则)。

目前我正在使用 for 循环遍历数据集并应用这些规则(从而使它们连续)。但是,每个规则的输出都是独立的,因此,我想确保它们并行运行。

我探索了 R 中的 parallel 包,但无法缩小我正在寻找的内容。我正在寻找的是 -

dataset 是我的数据表
rulesSet 是我的规则文件

^ 这些是在 .Rmd 文件中读取的

applyRules(dataset,rulesSet)是以上述两个为参数并返回结果数据的函数

^此函数存在于单独的 util.R 文件中,但正在从 .Rmd 调用

每行 rulesSet 应用于数据集并返回结果数据表。我试着写 -

clusterApplyLB(cl=clust,
               sampleRules,
               fun=function(x){
                   applyRules(sampleDataset, x, "union")
               })

还有 parLapply/Sapply 使用相同的格式但徒劳无功(我收到一个错误提示 could not find function applyRules

谁能告诉我哪里出错了?

【问题讨论】:

  • 在您致电applyRules() 时,"union" 在做什么?我认为这是您在上面没有提到的参数。
  • 这只是我希望每个规则的输出如何相互交互,即如果“联合”则联合输出数据集,如果“交叉”则同样
  • 这些答案是否解决了您的问题?如果是这样,您应该通过单击投票按钮下方的绿色复选框来接受其中之一。如果没有,请告诉我们出了什么问题,以便我们更新或完善我们的答案。

标签: r parallel-processing r-markdown


【解决方案1】:

当您使用 parallelsnow 创建集群时,它会生成许多节点,这些节点实际上是独立的 rsession 实例(您可以通过查看活动监视器、任务管理器或顶部来检查它们)跑步)。由于它们是单独的 R 会话,因此它们都有自己的环境,并且看不到在您的主 R 环境中加载的对象。在运行clusterApply 之前,您需要使用clusterExport 函数将节点需要使用的任何对象导出到它们的环境中。

现在,就您而言,这个结果很奇怪,因为您可以通过clusterApplyLB 函数传入对象和函数。但是,您收到的错误告诉我,无论出于何种原因,您的一个节点正试图从不可用的环境中调用applyRules。尝试将您的函数(可能还有您的数据集,如有必要)导出到集群,如下所示,看看是否能解决您的问题。

cl <- makecluster(4)
clusterExport(cl, 'applyRules')
results <- clusterApplyLB(cl,
                          sampleRules,
                          fun = function(x) {
                              applyRules(sampleDataset, x, "union")
                          })
stopCluster(cl)

【讨论】:

  • 很好的解释,但 OP 可能必须导出比 applyRules 函数更多的内容
【解决方案2】:

future 框架的作者在这里。如果您可以得到以下顺序调用:

res <- lapply(sampleRules, FUN = function(x) {
  applyRules(sampleDataset, x, "union")
})

那么你可能会取得更好的成功:

library(future.apply)
plan(multiprocess)

res <- future_lapply(sampleRules, FUN = function(x) {
  applyRules(sampleDataset, x, "union")
})

因为它会尝试识别所有依赖包和全局对象,并自动将它们导出给工作人员。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 2015-02-13
    • 2015-03-26
    • 1970-01-01
    • 2011-11-06
    • 2021-08-11
    • 2018-04-02
    • 1970-01-01
    相关资源
    最近更新 更多