全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
7651 16
2016-10-04
我有3000个data.frame存在sqlite多个库的3000张表中,需要循环取出每张表,经过适量预处理后形成data.frame,将所有data.frame合并为一个大的data.frame。

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

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

二维码

扫码加我 拉你入群

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

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

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

扫码加我 拉你入群

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

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

2016-10-4 20:03:48
lqb1987 发表于 2016-10-4 14:58
我有3000个data.frame存在sqlite多个库的3000张表中,需要循环取出每张表,经过适量预处理后形成data.frame ...
用data.table
二维码

扫码加我 拉你入群

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

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

2016-10-4 20:28:10
dat=list(data.frame1,data.frame2,....)
do.call("rbind", dat)
二维码

扫码加我 拉你入群

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

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

2016-10-6 10:18:34
感谢微笑曙光的想法。我再试试zhou1_20的利器。
二维码

扫码加我 拉你入群

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

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

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秒,还是不行的。
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群