2013-06-28 12 views
5

Questi sono i miei primi passi con il calcolo parallelo in R. Il codice seguente genera il seguente errore. Sono senza tracce, dal momento che non c'è alcuna funzione di mclapply in ciò che ho scritto, almeno non l'ho esplicitamente messo.paralleli foreach loop producono errori mclapply

Errore:

Error in mclapply(argsList, FUN, mc.preschedule = preschedule, mc.set.seed = set.seed, : 
    (list) object cannot be coerced to type 'integer' 
Calls: %dopar% -> <Anonymous> -> mclapply 
Execution halted 

Codice:

dist<-array(0, dim=c(320,500,25)) 

mc<-8 
cl<-makeCluster(mc) 
registerDoMC(cl) 
opts<-list(chunkSize=10) 

for(a in 1:25) { 
    dist[,,a]<-foreach(x=1:500, .combine='cbind', .options.mc=opts) %:% 
    foreach(y=1:320, .combine='c') %dopar% { 
     gcd.slc(crdsx[y,x], crdsy[y,x], lot[a,5], lot[a,4]) 
    } 
} 
stopCluster(cl) 

su una macchina diversa, funziona bene con

registerDoParallel(cl) 

invece di

registerDoMC(cl) 
+1

puoi aggiungere sessionInfo() all'OP? –

+1

Quando si registra un backend parallelo con 'registerDoMC', la funzione' doMC' è impostata per l'esecuzione quando si chiama la funzione '% dopar%'. 'doMC' include una chiamata a' mclapply', quindi è da dove viene. – BenBarnes

risposta

9

Si sta verificando quell'errore perché registerDoMC prevede un argomento intero, non un oggetto cluster, mentre registerDoParallel prevede un numero intero o un oggetto cluster. Fondamentalmente, è necessario decidere quale pacchetto usare e non mescolarli.

Se si utilizza doMC, non si crea mai un oggetto cluster. Un minimo doMC esempio assomiglia:

library(doMC) 
registerDoMC(3) 
foreach(i=1:10) %dopar% sqrt(i) 

Il pacchetto doParallel è un mashup dei pacchetti doMC e doSNOW, e quindi non c'è bisogno di utilizzare oggetti cluster. Convertire l'esempio precedente doParallel è molto semplice:

library(doParallel) 
registerDoParallel(3) 
foreach(i=1:10) %dopar% sqrt(i) 

La cosa confusione è che su Windows, doParallel sarà effettivamente creare e utilizzare un oggetto gruppo dietro le quinte, mentre su Linux e Mac OS X, non è così utilizzare un oggetto cluster perché utilizza mclapply proprio come nel pacchetto doMC. Penso che sia conveniente, ma può essere fonte di confusione.

+0

Grazie. Dopo aver modificato numerosi esempi da vari pacchetti, mi sono ritrovato con registerDoMc (cluster) nel bel mezzo della notte. Forse non avrei mai fatto questa domanda al mattino dopo un secondo pensiero acuto ... Mettere un intero come argomento e affidarsi esclusivamente a doMC era davvero quello che stavo cercando, grazie! – user2530062