2012-05-07 23 views
6

Mam skrypt R do ładowania wielu plików tekstowych w katalogu i zapisywania danych jako skompresowane .rda. Wygląda na to,ładowanie nowych plików w katalogu

#!/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!") 

Pliki są dość duże (15Mb każda, 50 z nich typowo), więc działa ten skrypt trwa do kilku minut zazwyczaj znaczna część, która zostanie podjęta pisanie .rda wyniki.

Często aktualizuję katalog z nowymi plikami danych, dlatego chciałbym dołączyć je do wcześniej zapisanych i skompresowanych danych. To właśnie robię powyżej, sprawdzając, czy istnieje już plik wyjściowy o tej nazwie. Ostatni krok jest nadal dość powolny, zapisując plik .rda.

Czy istnieje inteligentniejszy sposób, aby przejść do tego w niektórych pakietach, zachowując ślad, które pliki zostały przeczytane, i zapisując to szybciej?

Zobaczyłem, że knitr używa tools:::makeLazyLoadDB do zapisywania swoich obliczeń w pamięci podręcznej, ale ta funkcja nie jest udokumentowana, więc nie jestem pewien, w jakim sensie z niej korzystać.

Odpowiedz

6

przypadku plików pośrednich, które muszę przeczytać (lub napisać) często używam

save (..., compress = FALSE) 

który przyspiesza rzeczy znacznie.

+0

to jest znacznie szybciej, dzięki. – baptiste