为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

汪汪一只猫 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 关注
  • 675 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信