快速读取非常大的表作为数据帧

快速读取非常大的表作为数据帧

我有非常大的表(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))))

有没有更好的方法呢?或者很可能完全不同的方法来解决问题?


汪汪一只猫
浏览 676回答 4
4回答

慕运维8079593

我最初没有看到这个问题,并在几天后问了一个类似的问题。我将把我之前的问题记下来,但我想我会在这里添加一个答案来解释我以前是怎么sqldf()做的。关于将2GB或更多文本数据导入R数据帧的最佳方法,已经进行了一些讨论。昨天我写了一篇关于使用sqldf()将数据导入SQLite作为临时区域的博客文章,然后将其从SQLite吸入R中。这对我来说非常有用。我能够在<5分钟内输入2GB(3列,40mm行)的数据。相比之下,该read.csv命令整晚都没有完成。这是我的测试代码:设置测试数据:bigdf&nbsp;<-&nbsp;data.frame(dim=sample(letters,&nbsp;replace=T,&nbsp;4e7),&nbsp;fact1=rnorm(4e7),&nbsp;fact2=rnorm(4e7,&nbsp;20,&nbsp;50))write.csv(bigdf,&nbsp;'bigdf.csv',&nbsp;quote&nbsp;=&nbsp;F)我在运行以下导入例程之前重新启动了R:library(sqldf)f&nbsp;<-&nbsp;file("bigdf.csv")system.time(bigdf&nbsp;<-&nbsp;sqldf("select&nbsp;*&nbsp;from&nbsp;f",&nbsp;dbname&nbsp;=&nbsp;tempfile(),&nbsp;file.format&nbsp;=&nbsp;list(header&nbsp;=&nbsp;T, &nbsp;row.names&nbsp;=&nbsp;F)))我让以下一行整夜运行,但它从未完成:system.time(big.df&nbsp;<-&nbsp;read.csv('bigdf.csv'))

跃然一笑

奇怪的是,多年来没有人回答问题的底部,即使这是一个重要的部分 -&nbsp;data.frame只是具有正确属性的列表,所以如果你有大数据,你不想使用as.data.frame或类似的列表。简单地将列表“转”为就地数据框要快得多:attr(df,&nbsp;"row.names")&nbsp;<-&nbsp;.set_row_names(length(df[[1]]))class(df)&nbsp;<-&nbsp;"data.frame"这不会使数据副本立即生成(与所有其他方法不同)。它假定您已经相应地设置names()了列表。[至于将大数据加载到R中 - 我个人将它们按列转储到二进制文件中并使用readBin()- 这是迄今为止最快的方法(除了映射)并且仅受磁盘速度的限制。与二进制数据相比,解析ASCII文件本质上很慢(即使在C中)。
打开App,查看更多内容
随时随地看视频慕课网APP