2014-02-19 106 views
0

我應該讀取一個很大的CSV文件(包含30000行和10000列)。不知何故,我應該逐列閱讀數據。這是我的代碼:從csv文件讀取數據需要很長的時間

con<-file("D:\\Data.csv","r") 
datalist<-list() 
for(spalte in 5:5) 
{ 
    for(i in 1:20000) 
    { 

    line<-readLines(con,n=1,warn=FALSE) 
    m<-list(as.integer(unlist(strsplit(line,split=",")))) 
    datalist<-c(datalist,sapply(m,"[[",spalte)) 

    } 

} 

但是這段代碼只需要4分鐘只讀一列(在本例中是第5列)。我應該怎樣做才能更快地完成這項工作?

+0

你是什麼意思? – Kaja

+0

是否需要逐行讀取數據?爲什麼? – tonytonov

+0

如果我使用'read.csv'方法,我得到一個有關文件大小的錯誤 – Kaja

回答

1

不要發明自己的解決方案來解決問題。如果read.csv給你內存不足的錯誤,那麼:

1)確保你使用的是64位R(沒有4GB RAM限制)。

2)忽略一些行,你不需要節省空間。 colbycol package對此很有用。

3)將文件讀入數據庫,並從那裏導入需要的東西。有很多解決方案,首先閱讀this SO question的答案。

4)購買更多RAM,或者在具有更多RAM(也許是雲服務器)的遠程工作站上運行分析或使用內存不足的軟件包。請參閱Task View on High Performance Computing

+0

謝謝,但問題是我需要csv文件中的所有數據 – Kaja

+0

有很多選項;最好的取決於你的設置。你在使用64位R嗎?你的機器有多少內存?你能買到還是買更多?你能訪問更多RAM的工作站嗎,還是使用雲計算服務?你有權訪問任何可用作臨時區域的數據庫嗎?你真的確定你需要所有30k列嗎? –

+0

@Kaja你知道這是大約2.2 Gb的數據嗎?在典型的計算機上進行分析並不容易也不快捷。 – James

0

嘗試fread(文件名)。它在data.table包中。閱讀大文件速度非常快。

system.time(fread('abc.csv')) 
user system elapsed 
0.41 0.00 0.40 

system.time(read.csv('abc.csv')) 
user system elapsed 
2.28 0.02 2.29 

如果您有內存問題,然後爲裏奇建議使用64位,並嘗試在服務器上運行,或者你甚至可以得到亞馬遜EC2機與大容量的RAM。

+0

問題是,我沒有足夠的內存 – Kaja

+1

您也可以嘗試庫(「ff」) x < - read.csv.ffdf(file =「file.csv」,header = TRUE,VERBOSE = TRUE,首先。 rows = 10000,next.rows = 50000,colClasses = NA) – user1525721

相關問題