2013-02-27 96 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