2

我有一个拟合模型,我想应用它来对存储为 CSV 的新数据集进行评分。不幸的是,新数据集有点大,如果我一次完成所有预测,预测过程就会耗尽内存。因此,我想将适用于以下小型集合的过程转换为一次处理 500 行的批处理模式,然后为每个得分 500 输出一个文件。

我从这个答案(What is a good way to read line-by-line in 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使用skipandnrows参数将数据分块读入内存。在伪代码中:

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 回答