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.
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
Ehi, mi hai battuto! –
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. –