Sto partizionando un frame di dati con split()
per utilizzare parLapply()
per chiamare una funzione su ogni partizione in parallelo. Il frame di dati ha 1,3 milioni di righe e 20 colonne. Sto dividendo/partizionando di due colonne, entrambi i tipi di carattere. Sembra che ci siano ~ 47K ID univoci e ~ 12K codici univoci, ma non tutti gli accoppiamenti di ID e codice sono abbinati. Il numero risultante di partizioni è ~ 250K. Ecco la linea split()
:Alternativa veloce a dividere in R
system.time(pop_part <- split(pop, list(pop$ID, pop$code)))
Le partizioni saranno poi inseriti in parLapply()
come segue:
cl <- makeCluster(detectCores())
system.time(par_pop <- parLapply(cl, pop_part, func))
stopCluster(cl)
Ho lasciato il codice split()
solo corro quasi un'ora e non completa. Posso dividere solo per ID, che richiede ~ 10 minuti. Inoltre, R studio e i thread di lavoro consumano circa 6 GB di RAM.
Il motivo per cui conosco il numero risultante di partizioni è che ho codice equivalente in Pentaho Data Integration (PDI) che viene eseguito in 30 secondi (per l'intero programma, non solo il codice "split"). Non spero in quel tipo di performance con R, ma qualcosa che forse si completa in 10-15 minuti nel peggiore dei casi.
La domanda principale: esiste un'alternativa migliore alla divisione? Ho anche provato ddply()
con .parallel = TRUE
, ma è anche durato più di un'ora e non è mai stato completato.
Grazie, ci proverò. Ah, in realtà ho scritto il codice R inizialmente e poi l'ho portato su PDI (sono più esperto di R che PDI). – argoneus
Ho eseguito il codice 'split()' che hai postato e ho aspettato per quasi un'ora, ma non è mai stato completato. – argoneus
Un paio di suggerimenti aggiuntivi aggiunti attorno a split, che dovrebbero assumere un ordine di un secondo o meno. Forse anche i fattori stanno causando il rallentamento delle funzioni? –