6

ディレクトリに複数のテキスト ファイルをロードし、データを圧縮された .rda として保存する R スクリプトがあります。このように見えます。

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

ファイルは非常に大きい (それぞれ 15Mb、通常は 50 個) ため、このスクリプトの実行には通常数分かかり、その大部分は .rda 結果の書き込みに費やされます。

ディレクトリを新しいデータ ファイルで頻繁に更新するため、以前に保存して圧縮したデータにそれらを追加したいと考えています。これは、その名前の出力ファイルが既に存在するかどうかを確認することによって、上記で行っていることです。最後のステップはまだかなり遅く、.rda ファイルを保存しています。

一部のパッケージでこれを行うよりスマートな方法はありますか?どのファイルが読み取られたかのトレースを保持し、これをより速く保存しますか?

knitrキャッシュされた計算を保存するために使用するのを見ましたtools:::makeLazyLoadDBが、この関数は文書化されていないため、どこで使用するのが適切かわかりません。

4

1 に答える 1

6

頻繁に読み取る(または書き込む)必要がある中間ファイルには、

save (..., compress = FALSE)

これにより、物事が大幅に高速化されます。

于 2012-05-07T11:19:45.703 に答える