首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中“并行”的并行处理

R中“并行”的并行处理
EN

Stack Overflow用户
提问于 2018-04-05 13:28:55
回答 2查看 370关注 0票数 0

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

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

我探索了R中的并行包,但无法缩小我要寻找的内容。我要找的是-

数据集是我的数据表

rulesSet是我的规则文件

^这些内容正在.Rmd文件中读取。

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

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

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

代码语言:javascript
复制
clusterApplyLB(cl=clust,
               sampleRules,
               fun=function(x){
                   applyRules(sampleDataset, x, "union")
               })

也可以使用相同格式的parLapply/Sapply,但徒劳无功(我收到一个错误,说找不到函数applyRules)

有人能告诉我哪里出了问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-05 14:02:14

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

现在,在您的例子中,这个结果是奇怪的,因为您可以通过clusterApplyLB函数传递对象和函数。但是,您所得到的错误告诉我,无论出于什么原因,您的一个节点都试图从不可用的环境中调用applyRules。尝试将您的函数(如果有必要的话,也可能是您的数据集)导出到集群中,如下所示,看看这是否解决了您的问题。

代码语言:javascript
复制
cl <- makecluster(4)
clusterExport(cl, 'applyRules')
results <- clusterApplyLB(cl,
                          sampleRules,
                          fun = function(x) {
                              applyRules(sampleDataset, x, "union")
                          })
stopCluster(cl)
票数 1
EN

Stack Overflow用户

发布于 2018-04-06 04:03:42

这里是未来框架的作者。如果您可以通过以下顺序调用来工作:

代码语言:javascript
复制
res <- lapply(sampleRules, FUN = function(x) {
  applyRules(sampleDataset, x, "union")
})

那么,您可能会在以下方面获得更好的成功:

代码语言:javascript
复制
library(future.apply)
plan(multiprocess)

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

因为它试图标识所有依赖的包和全局对象,并自动将它们导出到工作人员。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49673617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档