2012-05-30 13 views
5

Chcę uruchomić program, który wymaga znacznego czasu. Chcę napisać funkcję, która może działać równolegle (jestem użytkownikiem interfejsu graficznego w oknach). Funkcja dzieli zadanie na n pod zadań i wykonuje końcowe zadanie konsensusu. Chcę uruchomić n zadania równolegle (w tym samym czasie w tym samym oknie programu), a następnie połączyć wyjścia. Poniższy tylko przykład:uruchamianie wielu zadań w tle w tym samym czasie (równolegle) w r

ptm <- proc.time() 
j1 <- cov(mtcars[1:10,], use="complete.obs") # job 1 
j2 <- cov(mtcars[11:20,], use="complete.obs") # job 2 
j3 <- cov(mtcars[21:32,], use="complete.obs") # job 3 
proc.time() - ptm 

out <- list (j1 = j1, j2 = j2, j3 = j3) 

wiem w systemie UNIX „&” zazwyczaj umożliwia uruchomienie zadania w tle. Czy jest podobny sposób w R

+1

spojrzenie na opakowaniu równoległym, to jest wliczone w R 2.15: 'równolegle :: parallel' –

+0

Uwaga jednak, że bez dostatecznie procesorów wielordzeniowych, wysokość świadczenia można uzyskać od parallelisation jest ograniczona. – Fhnuzoag

Odpowiedz

7

Możesz użyć mclapply lub clusterApply , aby uruchomić równolegle kilka funkcji. Nie są one naprawdę w tle: R będzie czekać, aż wszystkie zostaną zakończone (tak, jakbyś używał wait, w powłoce uniksowej, po uruchomieniu procesów w tle).

library(parallel) 
tasks <- list(
    job1 = function() cov(mtcars[1:10,], use="complete.obs"), 
    job2 = function() cov(mtcars[11:20,], use="complete.obs"), 
    job3 = function() cov(mtcars[21:32,], use="complete.obs"), 
    # To check that the computations are indeed running in parallel. 
    job4 = function() for (i in 1:5) { cat("4"); Sys.sleep(1) }, 
    job5 = function() for (i in 1:5) { cat("5"); Sys.sleep(1) }, 
    job6 = function() for (i in 1:5) { cat("6"); Sys.sleep(1) } 
) 

# Using fork() 
out <- mclapply( 
    tasks, 
    function(f) f(), 
    mc.cores = length(tasks) 
) 

# Equivalently: create a cluster and destroy it. 
# (This may work on Windows as well.) 
cl <- makeCluster(length(tasks)) 
out <- clusterApply( 
    cl, 
    tasks, 
    function(f) f() 
) 
stopCluster(cl) 
1

Mam dobre doświadczenie przy użyciu funkcji pakietu plyr wraz z równoległym zapleczem utworzonym przez snow. W a blog post opiszę, jak to zrobić. Po R 2.14 przetwarzanie równoległe jest częścią dystrybucji rdzenia R poprzez pakiet parallel. Nie próbowałem pozwolić, aby plyr działał z backendem wygenerowanym przez parallel, ale myślę, że to powinno działać.

Powiązane problemy