楼主: lqb1987
7760 16

[问答] 如何高效合并大量的data.frame [推广有奖]

  • 1关注
  • 2粉丝

已卖:6份资源

讲师

1%

还不是VIP/贵宾

-

威望
0
论坛币
3602 个
通用积分
3.7540
学术水平
24 点
热心指数
33 点
信用等级
18 点
经验
11213 点
帖子
403
精华
0
在线时间
297 小时
注册时间
2009-5-18
最后登录
2022-2-28

楼主
lqb1987 发表于 2016-10-4 14:58:16 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
我有3000个data.frame存在sqlite多个库的3000张表中,需要循环取出每张表,经过适量预处理后形成data.frame,将所有data.frame合并为一个大的data.frame。

简单实现就是for(i in 1:3000){...}
循环中读表,处理,再df=rbind(df, newdf)。

问题来了,期初,df较小,rbind操作还很快,到后来,df越来越大,rbind操作越来越耗时。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Frame Fram Data FRA RAM 如何

回帖推荐

zhou1_20 发表于3楼  查看完整内容

用data.table

本帖被以下文库推荐

沙发
johnmy 发表于 2016-10-4 19:55:00
因为每次rbind都要重新分配内存,所以会慢。
我想可以预先定义一个list来存放表格。
最后再rbind

藤椅
zhou1_20 发表于 2016-10-4 20:03:48 来自手机
lqb1987 发表于 2016-10-4 14:58
我有3000个data.frame存在sqlite多个库的3000张表中,需要循环取出每张表,经过适量预处理后形成data.frame ...
用data.table
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
李会超 + 60 + 5 精彩帖子
lqb1987 + 5 + 3 + 3 + 3 感谢

总评分: 经验 + 60  论坛币 + 10  学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

板凳
微笑曙光 发表于 2016-10-4 20:28:10
dat=list(data.frame1,data.frame2,....)
do.call("rbind", dat)

报纸
lqb1987 发表于 2016-10-6 10:18:34
感谢微笑曙光的想法。我再试试zhou1_20的利器。

地板
lqb1987 发表于 2016-10-6 10:19:47
微笑曙光 发表于 2016-10-4 20:28
dat=list(data.frame1,data.frame2,....)
do.call("rbind", dat)
读取数据(200组)
> system.time({
+   dat <- list()
+   for(i in seq_along(lst)) dat[] <- dbReadTable(con, lst[j])
+ })
用户  系统  流逝
33.05  4.95 38.55

合并数据
> system.time({df <- do.call("rbind", dat[1:10])})
用户 系统 流逝
0.42 0.07 0.48
> system.time({df <- do.call("rbind", dat[1:20])})
用户 系统 流逝
1.18 0.53 1.83
> system.time({df <- do.call("rbind", dat[1:30])})
用户 系统 流逝
2.43 1.08 3.55
> system.time({df <- do.call("rbind", dat[1:40])})
用户 系统 流逝
4.39 1.89 6.28
> system.time({df <- do.call("rbind", dat[1:50])})
用户 系统 流逝
6.89 2.93 9.88
> system.time({df <- do.call("rbind", dat[1:60])})
用户  系统  流逝
9.88  4.48 14.46
> system.time({df <- do.call("rbind", dat[1:70])})
用户  系统  流逝
14.28  5.69 20.25

rbind合并耗时基本是二次项增长的,说明还是每次追加1组数据就重写内存的。10个df耗时0.5秒,我的数据有3000个df,按这个速度预计需要40830秒,还是不行的。

7
lqb1987 发表于 2016-10-6 10:32:04
zhou1_20 发表于 2016-10-4 20:03
用data.table
dat <- list()
for(i in seq_along(lst)) dat[] <- dbReadTable(con, lst[j])
system.time({  df <- data.table::rbindlist(dat[1:70])  })   #耗时0.28秒,耗时线性增长
system.time({df<-do.call("rbind", dat[1:70])})   #耗时20.25秒,耗时二次项增长

8
cheetahfly 在职认证  发表于 2016-10-8 20:25:44
最近刚好做过类似的工作,把所有A股个股的历史数据合并成一个总的data.frame,其他方法要么慢,要么内存需求太大,最后还是用data.table package搞定的。

9
jiqimao742 发表于 2016-10-9 00:14:47
可以用@reshape@package吗?

10
刺客王朝 学生认证  发表于 2016-10-9 09:11:44
list,把握R基于向量化的特点与优势

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-29 13:26