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ć.
to jest znacznie szybciej, dzięki. – baptiste