2011-12-29 8 views
7

Ho un set di dati abbastanza grande (~ 1,4 m righe) che sto facendo un po 'di divisione e riepilogo. Il tutto prende un po 'per l'esecuzione, e la mia domanda finale dipende in esecuzione frequente, quindi il mio pensiero è stato quello di utilizzare doMC e la bandiera .parallel=TRUE con plyr in questo modo (semplificato un po'):Utilizzare plyr, doMC e riepilogare() con un set di dati molto grande?

library(plyr) 
require(doMC) 
registerDoMC() 

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

Se ho impostato il numero di core esplicitamente a due (usando registerDoMC(cores=2)) i miei 8 GB di RAM mi vedono passare, e si fa una buona quantità di tempo. Tuttavia, se lascio che usi tutti gli 8 core, esaurisco rapidamente la memoria a causa del fatto che ciascuno dei processi biforcati sembra clonare l'intero set di dati in memoria.

La mia domanda è se sia possibile o meno utilizzare le funzionalità di esecuzione parallela di plyr in un modo più parsimonioso e memoria? Ho provato a convertire il mio dataframe ad un big.matrix, ma questo semplicemente sembrava forzare il tutto torna ad usare un singolo core:

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

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

Questa è la mia prima incursione nel multicore R computing, quindi se c'è un modo migliore di pensando a questo, sono aperto a suggerimenti.

AGGIORNAMENTO: Come in molte altre cose nella vita, risulta che stavo facendo Altre cose stupide altrove nel mio codice e che l'intera questione della multielaborazione diventa un punto controverso in questa particolare istanza. Tuttavia, per le attività di piegatura dei big data, terrò a mente data.table. Sono stato in grado di replicare il mio compito di piegatura in modo semplice.

+3

Credo che lascerò il commento obbligatorio che si riferisce al pacchetto ** data.table **, che in genere è molto più veloce in questo tipo di cose. – joran

+0

Ehi, mi hai battuto! –

+2

Hai davvero 8 core? O piuttosto un Intel con 4 core e 4 core "hyperthreading"? Ho un'applicazione che gira sotto MPICH (non R) che scala bene fino al 4 al 50% della CPU, ma funziona in modo molto più lento quando vengono richiesti 8 core che danno il 100% di CPU. –

risposta

6

Non penso che plyr faccia copie dell'intero set di dati. Tuttavia, durante l'elaborazione di un blocco di dati, tale sottoinsieme viene copiato sull'operatore. Pertanto, quando si usano più lavoratori, più sottoinsiemi sono in memoria simultaneamente (cioè 8 anziché 2).

mi viene in mente un paio di consigli si potrebbe provare:

  • mettere i vostri dati a una struttura di matrice in vece di un data.frame e utilizzare adply per fare il riassuntivo. gli array sono molto più efficienti in termini di utilizzo e velocità della memoria. Intendo usando matrici normali, non big.matrix.
  • Dai una prova a data.table, in alcuni casi questo può portare ad un aumento di velocità di diversi ordini di grandezza. Non sono sicuro che data.table supporti l'elaborazione parallela, ma anche senza parallelizzazione, data.table potrebbe essere hunderds di tempi più veloci. Vedere uno blog post of mine confronto ave, ddply e data.table per l'elaborazione di blocchi di dati.
+1

Si potrebbe voler controllare quel post del blog.Le tre funzioni che stai confrontando sembrano svolgere compiti diversi: solo una di esse sta calcolando una media per quanto posso dire. –

+0

Grazie, gli darò un'occhiata! Sospetto che non cambi l'esito del post, ovvero che data.table sia molto più veloce. –

Problemi correlati