我有一个数据表,我上传的是R(多列的.csv格式),其中需要应用某些用户定义的规则(另一个.csv格式的文件,其中每一行定义一个规则)。
目前,我正在使用for循环来迭代数据集并应用这些规则(因此它们是连续的)。但是,每个规则的输出都是独立的,因此,我希望确保它们并行运行。
我探索了R中的并行包,但无法缩小我要寻找的内容。我要找的是-
数据集是我的数据表
rulesSet是我的规则文件
^这些内容正在.Rmd文件中读取。
applyRules(dataset,rulesSet)是以上述两个参数为参数并返回结果数据的函数。
^此函数存在于单独的util.R文件中,但正在从.Rmd调用
要应用于dataset并返回结果数据表的rulesSet的每一行。我试着写-
clusterApplyLB(cl=clust,
sampleRules,
fun=function(x){
applyRules(sampleDataset, x, "union")
})也可以使用相同格式的parLapply/Sapply,但徒劳无功(我收到一个错误,说找不到函数applyRules)
有人能告诉我哪里出了问题吗?
发布于 2018-04-05 14:02:14
当您使用parallel或snow创建集群时,它会生成许多节点,这些节点实际上是独立的rsession实例(您可以通过查看活动监视器、任务管理器或运行时的top来检查这些节点)。因为它们是单独的R会话,所以它们都有自己的环境,无法看到加载在主R环境中的对象。在运行clusterExport之前,您需要使用clusterApply函数将节点需要处理的任何对象导出到它们的环境中。
现在,在您的例子中,这个结果是奇怪的,因为您可以通过clusterApplyLB函数传递对象和函数。但是,您所得到的错误告诉我,无论出于什么原因,您的一个节点都试图从不可用的环境中调用applyRules。尝试将您的函数(如果有必要的话,也可能是您的数据集)导出到集群中,如下所示,看看这是否解决了您的问题。
cl <- makecluster(4)
clusterExport(cl, 'applyRules')
results <- clusterApplyLB(cl,
sampleRules,
fun = function(x) {
applyRules(sampleDataset, x, "union")
})
stopCluster(cl)发布于 2018-04-06 04:03:42
这里是未来框架的作者。如果您可以通过以下顺序调用来工作:
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")
})因为它试图标识所有依赖的包和全局对象,并自动将它们导出到工作人员。
https://stackoverflow.com/questions/49673617
复制相似问题