2016-01-18 162 views
-3

很長時間瀏覽了stackoverflow上的問題,發現很多有用的答案,我終於遇到了一些我無法找到答案的東西。這也是我註冊時開始回饋社區的時候,因爲當我遇到一個我可以做出有意義貢獻的問題時(也許還有一天)。爲什麼read.csv這麼慢?

不管怎樣,我的第一個計算器的問題,所以請溫柔與我:

我深知R中的read.csv功能絕不是在讀取數據時,許多問題,最有效的方法答案涉及read.csv的替代方案,但這個問題的重點略有不同,我想有兩個問題需要問。

  1. 我想知道的是爲什麼read.csv太慢了?什麼是造成其糟糕表現的開銷?
  2. 此外,我有很多計算機的財富,我可以測試一些代碼,包括一臺帶SSD的臺式機和一臺帶有標準硬盤的臺式機,在最近的測試中,我一直沒能找到一個明顯的區別在任何一臺機器上讀取時間(我預計使用固態驅動器的讀取時間會更快),爲什麼會出現這種情況?

一些代碼重現排序基準的,我一直在測試:

bm_io = function (runs = 3, n = 1e6, ncol = 1000) { 
     set.seed(1) 
     on.exit(set.seed(NULL)) 
     x = rnorm(n) 
     m = data.frame(matrix(x, ncol = ncol)) 
     timings = data.frame(user = numeric(2 * runs), system = 0, 
        elapsed = 0, test = c("write", "read")) 
     for (i in 1:runs) { 
     fname = tempfile(fileext = ".csv") 
     fname = "temp.csv" 
     invisible(gc()) 
     timings[2 * i - 1, 1:3] = system.time({ 
      write.csv(m, fname, row.names = FALSE) 
     })[1:3] 
     timings[2 * i, 1:3] = system.time({ 
      read.csv(fname) 
     })[1:3] 
     unlink(fname) 
     } 
     timings 
    } 

我希望有這方面的那些想法或意見,另外,如果我錯過了一個類似的問題,請隨時自由地指向正確的方向。非常感謝

回答

0

顯着的性能提升是參數colClasses。性能提升通常是兩倍。

我通常做在我的代碼讀取大的CSV文件是以下過程:

  • 讀取使用nrows
  • 從讀取數據幀的列提取類前幾排的
  • 負載使用colClasses
  • 如果失敗由於不可預見的數據使用整個數據,而無需colClasses
  • 與提取的類的全部數據幀
+0

嗨,感謝您花時間回覆。我知道'read.csv'有很多參數可以提高性能。雖然他們沒有一個像'data.table'包中的'fread'那麼接近。我的問題更多的是關於什麼使得'read.csv'與其他一些選擇相比如此緩慢,以及爲什麼我從SSD或硬盤讀取數據時看不到有什麼區別。 – jamieRowen