亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

快速讀取非常大的表作為數據幀

快速讀取非常大的表作為數據幀

汪汪一只貓 2019-05-28 17:33:54
快速讀取非常大的表作為數據幀我有非常大的表(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'))


查看完整回答
反對 回復 2019-05-28
?
躍然一笑

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中)。


查看完整回答
反對 回復 2019-05-28
  • 4 回答
  • 0 關注
  • 705 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號