g*r 发帖数: 67 | 1 R的merge效率太低了。根据一个列合并两个dataframe,长的有1m行,短的1k行:
long =data.frame(a=seq(1,1000000), b=rnorm(10) )
short=data.frame(a=seq(1,2000, 2), c=rnorm(10) )
system.time(merge(x=long, y=short, all.x=T))
user system elapsed
10.286 0.370 10.624
4m行就要将近1分钟。8m行超过2分钟。16m要4分钟。
我的真实数据比例子里的复杂些,且有100m行或更高,卡了半天没动静,只好强行终止
进程。对这个效率有点失望。早听说merge很慢,这次领教了。
如果不依靠外部程序(shell,python之类的script),大家是怎么多快好省做合并的
呢?菜鸟一个,轻拍。 | x******m 发帖数: 736 | 2 这个没办法,R就是慢。R在出来table的时候,后台会有很多enviromental variables
,所以会很慢。况且你是100m row的data,也不小了,好奇你是怎么读到R里面的?
既然都会R了,就试试python吧,很简单的,几行就能搞定。 | z*****i 发帖数: 366 | 3 http://stackoverflow.com/questions/11146967/efficient-alternati
【在 g*r 的大作中提到】 : R的merge效率太低了。根据一个列合并两个dataframe,长的有1m行,短的1k行: : long =data.frame(a=seq(1,1000000), b=rnorm(10) ) : short=data.frame(a=seq(1,2000, 2), c=rnorm(10) ) : system.time(merge(x=long, y=short, all.x=T)) : user system elapsed : 10.286 0.370 10.624 : 4m行就要将近1分钟。8m行超过2分钟。16m要4分钟。 : 我的真实数据比例子里的复杂些,且有100m行或更高,卡了半天没动静,只好强行终止 : 进程。对这个效率有点失望。早听说merge很慢,这次领教了。 : 如果不依靠外部程序(shell,python之类的script),大家是怎么多快好省做合并的
| i********t 发帖数: 809 | | S******y 发帖数: 1123 | 5 Python is the way to go
You can load your smaller file into a dictionary first... | g*r 发帖数: 67 | 6 长的数据100m行不是读入,而是在R里面生成的。
短的数据才是从外部文件导入的。
想把两者合并。
variables
【在 x******m 的大作中提到】 : 这个没办法,R就是慢。R在出来table的时候,后台会有很多enviromental variables : ,所以会很慢。况且你是100m row的data,也不小了,好奇你是怎么读到R里面的? : 既然都会R了,就试试python吧,很简单的,几行就能搞定。
| B*O 发帖数: 105 | 7 用match比较快。
> long =data.frame(a=seq(1,1000000), b=rnorm(10) )
> short=data.frame(a=seq(1,2000, 2), c=rnorm(10) )
> system.time(merge(x=long, y=short, all.x=T))
user system elapsed
7.253 0.071 7.385
> system.time(long$c<-rep(as.numeric(NA),dim(long)[1]))
user system elapsed
0.002 0.000 0.001
> system.time(long$c[match(short$a,long$a)]<-short$c)
user system elapsed
0.119 0.000 0.119 | g*r 发帖数: 67 | 8 出于力求“简单统一”的考虑,不想调用其他程序。(比如换到windows下跑,就需要
先安装python了)
试了一下大家的另外两个建议。
data.table是个好东西,瞬间完成!match稍慢,但可以接受。 | s*********e 发帖数: 1051 | 9 try sqldf with index. there is no overhead for data table conversion.
【在 g*r 的大作中提到】 : 出于力求“简单统一”的考虑,不想调用其他程序。(比如换到windows下跑,就需要 : 先安装python了) : 试了一下大家的另外两个建议。 : data.table是个好东西,瞬间完成!match稍慢,但可以接受。
| r********n 发帖数: 7441 | 10 这种简单查找型 merg 显然是用 awk 比较快了
【在 g*r 的大作中提到】 : R的merge效率太低了。根据一个列合并两个dataframe,长的有1m行,短的1k行: : long =data.frame(a=seq(1,1000000), b=rnorm(10) ) : short=data.frame(a=seq(1,2000, 2), c=rnorm(10) ) : system.time(merge(x=long, y=short, all.x=T)) : user system elapsed : 10.286 0.370 10.624 : 4m行就要将近1分钟。8m行超过2分钟。16m要4分钟。 : 我的真实数据比例子里的复杂些,且有100m行或更高,卡了半天没动静,只好强行终止 : 进程。对这个效率有点失望。早听说merge很慢,这次领教了。 : 如果不依靠外部程序(shell,python之类的script),大家是怎么多快好省做合并的
| o**a 发帖数: 1315 | |
|