E 'possibile iterativo su un singolo file di testo su una singola macchina multi-core in parallelo con R? Per il contesto, il file di testo è compreso tra 250 e 400 MB di output JSON.Può leggere linee in parallelo in R
EDIT:
Ecco alcuni esempi di codice che ho giocato in giro con. Con mia sorpresa, l'elaborazione parallela non ha vinto - solo lapply di base - ma ciò potrebbe essere dovuto a un errore dell'utente da parte mia. Inoltre, durante il tentativo di leggere un numero di file di grandi dimensioni, la mia macchina si è bloccata.
## test on first 100 rows of 1 twitter file
library(rjson)
library(parallel)
library(foreach)
library(plyr)
N = 100
library(rbenchmark)
mc.cores <- detectCores()
benchmark(lapply(readLines(FILE, n=N, warn=FALSE), fromJSON),
llply(readLines(FILE, n=N, warn=FALSE), fromJSON),
mclapply(readLines(FILE, n=N, warn=FALSE), fromJSON),
mclapply(readLines(FILE, n=N, warn=FALSE), fromJSON,
mc.cores=mc.cores),
foreach(x=readLines(FILE, n=N, warn=FALSE)) %do% fromJSON(x),
replications=100)
Ecco un secondo esempio di codice
parseData <- function(x) {
x <- tryCatch(fromJSON(x),
error=function(e) return(list())
)
## need to do a test to see if valid data, if so ,save out the files
if (!is.null(x$id_str)) {
x$created_at <- strptime(x$created_at,"%a %b %e %H:%M:%S %z %Y")
fname <- paste("rdata/",
format(x$created_at, "%m"),
format(x$created_at, "%d"),
format(x$created_at, "%Y"),
"_",
x$id_str,
sep="")
saveRDS(x, fname)
rm(x, fname)
gc(verbose=FALSE)
}
}
t3 <- system.time(lapply(readLines(FILES[1], n=-1, warn=FALSE), parseData))
Il problema è nella lettura del file JSON o nell'analisi del file JSON? –
Né. La mia macchina alla fine si blocca quando provo a usare un ciclo for semplice. Ho tentato di eseguire una funzione su ogni voce JSON, salvare file rds separati per la lettura, ecc, ecc. Con ogni opzione, sono anche consapevole dell'utilizzo della memoria e cerco di ottimizzare e pulire quando possibile. Alcune idee erano orribili, ma alla fine, voglio capire come "analizzare" serie di dati più grandi solo con Base R, ignorando il fatto che esistono soluzioni migliori per il momento. – Btibert3
Un esempio riproducibile renderebbe molto più facile per noi fornire un feedback. –