2011-12-29 8 views
7

Tengo un conjunto de datos bastante grande (~ 1.4m filas) sobre el que estoy dividiendo y resumiendo. Todo esto toma un tiempo para correr, y mi aplicación final depende de la ejecución frecuente, por lo que mi idea era utilizar doMC y la bandera .parallel=TRUE con plyr como tal (simplificado un poco):¿Cómo usar plyr, doMC y summarize() con un gran conjunto de datos?

library(plyr) 
require(doMC) 
registerDoMC() 

df <- ddply(df, c("cat1", "cat2"), summarize, count=length(cat2), .parallel = TRUE) 

Si fijo el número de núcleos explícitamente a dos (usando registerDoMC(cores=2)) mis 8 GB de RAM me ayudan, y reduce la cantidad de tiempo. Sin embargo, si dejo que use los 8 núcleos, rápidamente me quedo sin memoria debido al hecho de que cada uno de los procesos bifurcados parece clonar todo el conjunto de datos en la memoria.

Mi pregunta es si es posible o no utilizar las instalaciones de ejecución paralelas de plyr de una manera más ahorrativa de memoria? He intentado convertir mi trama de datos a un big.matrix, pero esto simplemente parecía obligar a todo el asunto de nuevo a usar un solo núcleo:

library(plyr) 
library(doMC) 
registerDoMC() 
library(bigmemory) 

bm <- as.big.matrix(df) 
df <- mdply(bm, c("cat1", "cat2"), summarize, count=length(cat2), .parallel = TRUE) 

Ésta es mi primera incursión en múltiples núcleos R computación, así que si hay una mejor manera de pensando en esto, estoy abierto a la sugerencia.

ACTUALIZACIÓN: Como con muchas cosas en la vida, resulta que yo estaba haciendo otras cosas estúpidas en otra parte de mi código, y que todo el tema de multi-procesamiento se convierte en un punto discutible en este caso particular. Sin embargo, para tareas de plegado de big data, tendré en cuenta data.table. Pude replicar mi tarea de plegado de una manera directa.

+3

Supongo que dejaré el comentario obligatorio refiriéndome al paquete ** data.table **, que generalmente es mucho más rápido en este tipo de cosas. – joran

+0

¡Oye, me ganaste! –

+2

¿De verdad tienes 8 núcleos? ¿O más bien un Intel con 4 núcleos y 4 núcleos "hyperthreading"? Tengo una aplicación que se ejecuta bajo MPICH (no R) que se adapta bien hasta 4 a 50% de CPU, pero funciona de manera mucho más lenta cuando se solicitan 8 núcleos dando 100% de CPU. –

Respuesta

6

No creo que plyr haga copias de todo el conjunto de datos. Sin embargo, al procesar un fragmento de datos, ese subconjunto se copia al trabajador. Por lo tanto, cuando se usan más trabajadores, más subconjuntos están en memoria simultáneamente (es decir, 8 en lugar de 2).

puedo pensar en algunos consejos que puede probar:

  • Coloque sus datos en una estructura de matriz en lugar de un hoja.de.datos y utilizar adply para hacer el resumen. las matrices son mucho más eficientes en términos de uso de memoria y velocidad. Me refiero al uso de matrices normales, no big.matrix.
  • Prueba data.table, en algunos casos esto puede conducir a un aumento de la velocidad de varios órdenes de magnitud. No estoy seguro de si data.table admite el procesamiento paralelo, pero incluso sin paralelización, data.table podría ser muchísimo más rápido. Vea a blog post of mine comparando ave, ddply y data.table para procesar trozos de datos.
+1

Es posible que desee comprobar esa publicación en el blog.Las tres funciones que está comparando parecen estar haciendo tareas diferentes: solo una de ellas está calculando una media por lo que yo sé. –

+0

¡Gracias, lo voy a ver! Sospecho que no cambia el resultado de la publicación, es decir, que data.table es mucho más rápido. –

Cuestiones relacionadas