快速讀取非常大的表作為數據幀我有非常大的表(3000萬行),我想加載為R中的數據幀 read.table()有很多方便的功能,但似乎實現中有很多邏輯會減慢速度。在我的情況下,我假設我提前知道列的類型,表不包含任何列標題或行名稱,并且沒有任何我必須擔心的病態字符。我知道在表格中閱讀作為列表使用scan()可能非常快,例如:datalist <- scan('myfile',sep='\t',list(url='',popularity=0,mintime=0,maxtime=0)))但是我將此轉換為數據幀的一些嘗試似乎將上述性能降低了6倍:df <- as.data.frame(scan('myfile',sep='\t',list(url='',popularity=0,mintime=0,maxtime=0))))有沒有更好的方法呢?或者很可能完全不同的方法來解決問題?
4 回答

慕運維8079593
TA貢獻1876條經驗 獲得超5個贊
我最初沒有看到這個問題,并在幾天后問了一個類似的問題。我將把我之前的問題記下來,但我想我會在這里添加一個答案來解釋我以前是怎么sqldf()
做的。
關于將2GB或更多文本數據導入R數據幀的最佳方法,已經進行了一些討論。昨天我寫了一篇關于使用sqldf()
將數據導入SQLite作為臨時區域的博客文章,然后將其從SQLite吸入R中。這對我來說非常有用。我能夠在<5分鐘內輸入2GB(3列,40mm行)的數據。相比之下,該read.csv
命令整晚都沒有完成。
這是我的測試代碼:
設置測試數據:
bigdf <- data.frame(dim=sample(letters, replace=T, 4e7), fact1=rnorm(4e7), fact2=rnorm(4e7, 20, 50))write.csv(bigdf, 'bigdf.csv', quote = F)
我在運行以下導入例程之前重新啟動了R:
library(sqldf)f <- file("bigdf.csv")system.time(bigdf <- sqldf("select * from f", dbname = tempfile(), file.format = list(header = T, row.names = F)))
我讓以下一行整夜運行,但它從未完成:
system.time(big.df <- read.csv('bigdf.csv'))

躍然一笑
TA貢獻1826條經驗 獲得超6個贊
奇怪的是,多年來沒有人回答問題的底部,即使這是一個重要的部分 - data.frame
只是具有正確屬性的列表,所以如果你有大數據,你不想使用as.data.frame
或類似的列表。簡單地將列表“轉”為就地數據框要快得多:
attr(df, "row.names") <- .set_row_names(length(df[[1]]))class(df) <- "data.frame"
這不會使數據副本立即生成(與所有其他方法不同)。它假定您已經相應地設置names()
了列表。
[至于將大數據加載到R中 - 我個人將它們按列轉儲到二進制文件中并使用readBin()
- 這是迄今為止最快的方法(除了映射)并且僅受磁盤速度的限制。與二進制數據相比,解析ASCII文件本質上很慢(即使在C中)。
- 4 回答
- 0 關注
- 705 瀏覽
添加回答
舉報
0/150
提交
取消