2

CSVとして保存された新しいデータセットをスコアリングするために適用したいフィットモデルがあります。残念ながら、新しいデータセットはかなり大きいので、一度にすべてを実行すると、predictプロシージャのメモリが不足します。そこで、以下の小さなセットでうまく機能した手順を、一度に500行を処理し、スコアが500ごとにファイルを出力するバッチモードに変換したいと思います。

この回答(Rで行ごとに読み取る良い方法は何ですか?)から、これにreadLinesを使用できることがわかります。だから、私はから変換するでしょう:

trainingdata <- as.data.frame(read.csv('in.csv'), stringsAsFactors=F)
fit <- mymodel(Y~., data=trainingdata)

newdata <- as.data.frame(read.csv('newstuff.csv'), stringsAsFactors=F)
preds <- predict(fit,newdata)
write.csv(preds, file=filename)

次のようなものに:

trainingdata <- as.data.frame(read.csv('in.csv'), stringsAsFactors=F)
fit <- mymodel(Y~., data=trainingdata)

con  <- file("newstuff.csv", open = "r")
i = 0
while (length(mylines <- readLines(con, n = 500, warn = FALSE)) > 0) {
    i = i+1
        newdata <- as.data.frame(mylines, stringsAsFactors=F)
        preds <- predict(fit,newdata)
        write.csv(preds, file=paste(filename,i,'.csv',sep=''))
}
close(con)

ただし、ループ内でmylinesオブジェクトを印刷すると、read.csvが次のようなものを生成するのと同じように、正しく自動列化されません---ヘッダーはまだ混乱しており、モジュロ列幅が内部で発生しますベクトルをncolオブジェクトにラップすることは発生していません。

最初の行を切り取ったり、列を折り返したりするような野蛮なことを書いていることに気付いたときはいつでも、一般的にRの方が良い方法だと思います。readLines csv接続からread.csvのような出力を取得する方法についての提案はありますか?

4

1 に答える 1

2

および引数read.csvを使用して、チャンクでデータをメモリに読み込みたい場合。擬似コード:skipnrows

read_chunk = function(start, n) {
   read.csv(file, skip = start, nrows = n)
 }

start_indices = (0:no_chunks) * chunk_size + 1
lapply(start_indices, function(x) {
   dat = read_chunk(x, chunk_size)
   pred = predict(fit, dat)
   write.csv(pred)
  }

または、データを sqlite データベースに入れ、sqliteパッケージを使用してデータをチャンクでクエリすることもできます。この回答も参照するか[r] large csv、SOで掘り下げてください。

于 2013-02-27T15:41:51.303 に答える