2013-06-28 7 views
5

To są moje pierwsze kroki z przetwarzaniem równoległym w R. Poniższy kod powoduje następujący błąd. Nie mam pojęcia, ponieważ nie ma funkcji mclapply w tym, co napisałem, przynajmniej nie powiedziałem tego wyraźnie.równoległe pętle foreach wytwarzają błąd mclapply

Błąd:

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 

Kod:

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) 

na innym komputerze, to działa dobrze z

registerDoParallel(cl) 

zamiast

registerDoMC(cl) 
+1

czy można dodać sessionInfo() do OP? –

+1

Gdy rejestrujesz równoległy backend z 'registerDoMC', funkcja' doMC' jest ustawiona do wykonania, gdy wywołasz funkcję '% dopar%'. 'doMC' zawiera wywołanie' mclapply', więc to jest skąd pochodzi. – BenBarnes

Odpowiedz

9

Otrzymujesz ten błąd, ponieważ registerDoMC oczekuje argumentu liczby całkowitej, a nie obiektu klastra, podczas gdy registerDoParallel oczekuje, że obiekt jest liczbą całkowitą lub klastrem. Zasadniczo musisz zdecydować, który pakiet użyć, a nie je mieszać.

Jeśli używasz doMC, to nigdy nie tworzysz obiektu klastra. Minimalny doMC przykład wygląda następująco:

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

Pakiet doParallel jest mashup pakietów doMC i doSNOW, a więc nie trzeba używać obiektów klastra. Konwersja poprzedni przykład do doParallel jest bardzo prosta:

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

Mylące jest to, że w systemie Windows, doParallel rzeczywiście utworzyć i używać obiektu klastra za kulisami, podczas gdy w systemach Linux i Mac OS X, to nie robi użyj obiektu klastra, ponieważ używa on mclapply, tak jak w pakiecie doMC. Myślę, że jest to wygodne, ale może być źródłem nieporozumień.

+0

Dziękuję. Po modyfikacji wielu przykładów z różnych pakietów zostałem z registerDoMc (cluster) w środku nocy. Może nigdy nie zadałbym tego pytania rano po drugiej ostrej myśli ... Stawianie liczby całkowitej jako argumentu i poleganie wyłącznie na DoMC było rzeczywiście tym, czego szukałem, dziękuję! – user2530062