2012-05-07 13 views
6

Ho uno script R per caricare più file di testo in una directory e salvare i dati come .rda compresso. Ecco come si presenta,carica nuovi file nella directory

#!/usr/bin/Rscript --vanilla 

args <- commandArgs(TRUE) 
## arg[1] is the folder name 

outname <- paste(args[1], ".rda", sep="") 

files <- list.files(path=args[1], pattern=".txt", full=TRUE) 

tmp <- list() 
if(file.exists(outname)){ 
    message("found ", outname) 
    load(outname) 
    tmp <- get(args[1]) # previously read stuff 
    files <- setdiff(files, names(tmp)) 

} 

if(is.null(files)) 
    message("no new files") else { 

## read the files into a list of matrices 
results <- plyr::llply(files, read.table, .progress="text") 
names(results) <- files 

assign(args[1], c(tmp, results)) 
message("now saving... ", args[1]) 
save(list=args[1], file=outname) 
} 
message("all done!") 

I file sono abbastanza grandi (15Mb ciascuna, 50 di loro in genere), in modo da eseguire questo script richiede fino a un paio di minuti in genere, una parte sostanziale della quale è preso a scrivere il .rda risultati.

Aggiorno spesso la directory con nuovi file di dati, quindi desidero aggiungerli ai dati precedentemente salvati e compressi. Questo è ciò che faccio sopra controllando se c'è già un file di output con quel nome. L'ultimo passaggio è ancora piuttosto lento, salvando il file .rda.

C'è un modo più intelligente di fare questo in un pacchetto, tenere traccia di quali file sono stati letti e di salvarlo più velocemente?

Ho visto che knitr utilizza tools:::makeLazyLoadDB per salvare i calcoli memorizzati nella cache, ma questa funzione non è documentata, quindi non sono sicuro di dove abbia senso utilizzarlo.

risposta

6

Per i file intermedi che ho bisogno di leggere (o scrivere) spesso, io uso

save (..., compress = FALSE) 

che accelera notevolmente le cose.

+0

è molto più veloce, grazie. – baptiste

Problemi correlati