mtext - text in r
¿Cómo paralelizo en r en windows-ejemplo? (4)
¿Cómo consigo la paralelización de código para trabajar en r en Windows? Incluir un ejemplo simple. Publicar esta pregunta auto contestada porque esto era bastante desagradable para empezar a trabajar. Encontrará que el paquete paralelo no funciona por sí solo, pero el paquete snow funciona muy bien.
Basándome en la información here , pude convertir el siguiente código en una versión paralelizada que funcionaba bajo R Studio en Windows 7.
Código original:
#
# Basic elbow plot function
#
wssplot <- function(data, nc=20, seed=1234){
wss <- (nrow(data)-1)*sum(apply(data,2,var))
for (i in 2:nc){
set.seed(seed)
wss[i] <- sum(kmeans(data, centers=i, iter.max=30)$withinss)}
plot(1:nc, wss, type="b", xlab="Number of clusters",
ylab="Within groups sum of squares")
}
Código paralelizado:
library("parallel")
workerFunc <- function(nc) {
set.seed(1234)
return(sum(kmeans(my_data_frame, centers=nc, iter.max=30)$withinss)) }
num_cores <- detectCores()
cl <- makeCluster(num_cores)
clusterExport(cl, varlist=c("my_data_frame"))
values <- 1:20 # this represents the "nc" variable in the wssplot function
system.time(
result <- parLapply(cl, values, workerFunc) ) # paralel execution, with time wrapper
stopCluster(cl)
plot(values, unlist(result), type="b", xlab="Number of clusters", ylab="Within groups sum of squares")
No sugiriendo que sea perfecto o incluso mejor, solo un principiante que demuestra que el paralelo parece funcionar en Windows. Espero eso ayude.
Creo que estas bibliotecas te ayudarán a:
foreach (facilitates executing the loop in parallel)
doSNOW (I think you already use it)
doMC (multicore functionality of the parallel package)
Que estos articulos tambien te ayuden
http://vikparuchuri.com/blog/parallel-r-loops-for-windows-and-linux/
http://www.joyofdata.de/blog/parallel-computing-r-windows-using-dosnow-foreach/
Esto funcionó para mí, usé el paquete doParallel, requerí 3 líneas de código:
# process in parallel
library(doParallel)
cl <- makeCluster(detectCores(), type=''PSOCK'')
registerDoParallel(cl)
# turn parallel processing off and run sequentially again:
registerDoSEQ()
El cálculo de un bosque aleatorio disminuyó de 180 segundos a 120 segundos (en una computadora con Windows con 4 núcleos).
Publicando esto porque esto me llevó a la maldita eternidad a darme cuenta. Este es un ejemplo simple de paralelización en r que le permitirá probar si las cosas están funcionando bien para usted y ponerlo en el camino correcto.
library(snow)
z=vector(''list'',4)
z=1:4
system.time(lapply(z,function(x) Sys.sleep(1)))
cl<-makeCluster(###YOUR NUMBER OF CORES GOES HERE ###,type="SOCK")
system.time(clusterApply(cl, z,function(x) Sys.sleep(1)))
stopCluster(cl)
También debe usar la biblioteca doSNOW para registrarse para cada uno en el clúster de nieve, esto hará que muchos paquetes se paralicen automáticamente. El comando para registrarse es registerDoSNOW(cl)
(siendo cl
el valor de retorno de makeCluster()
), el comando que deshace el registro es registerDoSEQ()
. No olvides apagar tus grupos.