2017-10-03 3 views
1

(voir la solution de travail ci-dessous)multidplyr: assigner des fonctions à regrouper

Je veux utiliser multidplyr pour paralléliser une fonction:

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() 

je puis obtenir:

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 

Comment puis-je affecter des fonctions d'origine à chaque cœur?

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

Voici le script parfait:

doit extraire la valeur mise à jour, et tournez le résultat dans une trame de données

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

devez définir les clusters et affecter les fonctions provenant

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épondre

2

On dirait que vous avez initialisé une cl uster (bien que vous ne montriez pas cette partie). Vous devez exporter les variables/fonctions de votre environnement global vers chaque worker. En supposant que vous avez fait votre cluster comme

cl <- create_cluster(3) 
set_default_cluster(cl) 

Pouvez-vous essayer

cluster_copy(cl, f)  

Cette copiera-export et f à chaque travailleur (je pense ...)

extra

Vous rencontrerez probablement un autre problème, c'est-à-dire que votre fonction accepte x comme argument, auquel vous d 1

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

Puisque vous passer une trame de données à f, vous demandez data.frame+1, qui n'a pas de sens. Vous voudrez peut-être changer votre fonction à quelque chose comme

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

Merci pour cette réponse détaillée CPAK, plus d'informations pour les prochains: http://blog.aicry.com/multidplyr-dplyr-meets-parallel-processing / –