2012-05-30 9 views
5

Quiero ejecutar un programa que requiera un tiempo considerable. Quiero escribir una función que pueda ejecutarse en paralelo (soy un usuario de interfaz gráfica en Windows). La función divide la tarea en n subtareas y realiza una tarea final de consenso. Quiero ejecutar n tarea en paralelo (mismo tiempo dentro de la misma ventana del programa) y luego combinar las salidas. La siguiente sólo un ejemplo:ejecutar varios trabajos en segundo plano al mismo tiempo (en paralelo) en 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) 

Sé que en Unix "&" por lo general permite que los trabajos se ejecuten en segundo plano. ¿Hay manera similar en R

+1

vistazo al paquete paralelo, que está incluido en R 2.15:? 'Paralelo :: parallel' –

+0

en cuenta sin embargo que sin procesadores de múltiples núcleos suficientemente, la cantidad de beneficios que puede obtener de paralelización es limitado. – Fhnuzoag

Respuesta

7

Puede usar mclapply o clusterApply para ejecutar varias funciones en paralelo. No están realmente en segundo plano: R esperará hasta que hayan terminado (como si estuviera usando wait, en un shell Unix, después de iniciar los procesos en segundo plano).

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

Tengo buena experiencia usando las funciones del paquete plyr junto con un backend paralelo creado por snow. En a blog post describo cómo hacer esto. Después del procesamiento en paralelo R 2.14 es parte de la distribución del núcleo R a través del paquete parallel. No he intentado dejar que plyr funcione con un backend generado por parallel, pero creo que debería funcionar.

Cuestiones relacionadas