2013-02-27 94 views
2

我有一个拟合的模型,我想要应用于对存储为CSV的新数据集进行评分。不幸的是,新的数据集非常大,如果我一次全部完成,预测程序就会耗尽内存。所以,我想将可以正常工作的程序转换为可以一次处理500行的批处理模式,然后为每个得分500输出文件。将R read.csv转换为readLines批处理?

我明白这个答案(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有更好的方法来做事。任何关于如何让read.csv-like输出形成readLines csv连接的建议?

回答

2

如果要通过使用skipnrows参数使用read.csv将数据读入块内存中。在伪代码:

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包来查询块中的数据。另请参阅this answer,或者在SO上与[r] large csv进行一些挖掘。

+0

这不会保留我的标题,对不对? – Mittenchops 2013-02-27 15:57:13

+0

另外,如果我正确地理解了这一点:乐队仍然在做这个同时而不是批量的,对吗?如果由于拟合步骤我的过程耗尽内存,我仍然没有输出,而不是写入第一批n,第二批n等。 – Mittenchops 2013-02-27 15:59:53

+0

'lapply'分批执行此操作,每次调用'read_chunk'时,它将用于不同的'start'和'n'组合,因此用于'file'的不同子集。这不会保留'read_chunk'中的标题信息,但是如果你确实需要它,你可以在'lapply'循环外部读取标题。 – 2013-02-27 16:02:30