【问题标题】:multidplyr : assign functions to clustermultidplyr :将功能分配给集群
【发布时间】:2017-10-03 21:27:17
【问题描述】:

(请参阅下面的工作解决方案)

我想使用 multidplyr 来并行化一个函数:

calculs.R
f <- function(x){
return(x+1)
}

main.R
library(dplyr)
library(multidplyr)
source("calculs.R")
d <- data.frame(a=1:1000,b=sample(1:2,1000),replace=T)

result <- d %>% 
   partition(b) %>% 
     do(f(.)) %>%
     collect()  

然后我得到:

Initialising 3 core cluster.
Error in checkForRemoteErrors(lapply(cl, recvResult)) : 
  2 nodes produced errors; first error: could not find function "f"
In addition: Warning message:
group_indices_.grouped_df ignores extra arguments 

如何将源函数分配给每个内核?

===================

这是完美的脚本:

必须提取要更新的值,并将结果转换为数据框

calcul.R
f <- function(x){
    return(data.frame(x$a+1))
    }

必须设置集群并分配源函数

main.R
 library(dplyr)
library(multidplyr)
source("calculs.R")

cl <- create_cluster(3)
set_default_cluster(cl)
cluster_copy(cl, f)

d <- data.frame(a=1:10,b=c(rep(1,5),rep(2,5)))

  result <- d %>%
   partition(b) %>%
     do(f(.)) %>%
     collect()

【问题讨论】:

    标签: r parallel-processing dplyr multidplyr


    【解决方案1】:

    看起来你初始化了一个集群(虽然你没有展示这部分)。您需要将变量/函数从全局环境导出到每个工作人员。假设您将集群设为

    cl <- create_cluster(3)
    set_default_cluster(cl)
    

    你可以试试

    cluster_copy(cl, f)    
    

    这会将f 复制并导出给每个工人(我认为...)

    额外

    您可能会遇到另一个问题,即您的函数接受 x 作为参数,您添加 1

    f <- function(x){
             return(x+1)
    }
    

    由于您将数据框传递给f,因此您要求data.frame+1,这没有意义。您可能希望将您的功能更改为类似

    f <- function(x){
             return(x$a+1)
    }
    

    【讨论】:

    • 感谢 CPak 的详细回答,下一个的更多信息:blog.aicry.com/multidplyr-dplyr-meets-parallel-processing
    • 请注意,在最新版本的 multidplyr (commit a1ad225) 中,函数的名称似乎已从 create_cluster() 更改为 new_cluster()。据我所知,这个库的后端以及其他函数的名称最近发生了一些深刻的变化。
    猜你喜欢
    • 1970-01-01
    • 2012-11-12
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 2014-07-29
    相关资源
    最近更新 更多