楼主: rockfido
2203 18

[有偿编程] 求教大拿R data.table运算速度问题! [推广有奖]

  • 0关注
  • 0粉丝

博士生

32%

还不是VIP/贵宾

-

威望
0
论坛币
2724 个
通用积分
0.1841
学术水平
1 点
热心指数
1 点
信用等级
0 点
经验
2441 点
帖子
201
精华
0
在线时间
200 小时
注册时间
2008-8-29
最后登录
2024-4-26

100论坛币
大家好, 我现在在用r data.table编程来score一个credit risk model. 我现在遇到的问题是运行速度比较慢。 我的dataset很大,大概是有100mm的record,然后所有的data都load到memories (Ram也足够大: 2T)。现在我只需要用已经有的100个var(var1-var100)来create如下的一个新variable,但是就光这一步现在需要70s的时间。我想请教各位大拿,有没有什么方法可以提高这个运算效率呢? (真的情况是,我一共有40个scorecard equation,如果每个都要60s,那现在overall总共需要差不多1个小时来运算,但是老板要求把整个时间缩短到20分钟。。。。。。。。。)
(另外,所有的var1-var100的类型都是numeric)


谢谢!!

Final_data[,logit:=(-7.0056794347)        
+  ( 0.0456494244) * V1
+  ( 0.0757088261) * V2
+  ( -0.0109480275) * V3
+  ( 0.000025443) * V4
+  ( -0.0001152472) * V5
+  ( 0.000091941) * V6
+  ( 0.6211679803) * V7
+  ( 0.0395350435) * V8
+  ( 0.0562335702) * V9
+  ( -0.0086264852) * V10
+  ( -0.000086442) * V11
+  ( 0.0000865591) * V12
+  ( 0.1690682996) * V13
+  ( 0.4816358576) * V14
+  ( 0.5582802675) * V15
+  ( 0.2818112131) * V16
+  ( -0.8359998304) * V17
+  ( -0.1518909826) * V18
+  ( 0.0349408702) * V19
+  ( 0.1813907289) * V20
+  ( -0.0464902693) * V21
+  ( -0.001150833) * V22
+  ( -0.0000306922) * V23
+  ( 0.034907385) * V24
+  ( 0.1715049232) * V25
+  ( -0.0426696438) * V26
+  ( -0.0015329182) * V27
+  ( -0.0000270762) * V28
+  ( 0.0361545746) * V29
+  ( 0.1749647777) * V30
+  ( -0.0431259273) * V31
+  ( -0.0015678539) * V32
+  ( -0.0000263913) * V33
+  ( 0.0358181563) * V34
+  ( 0.1944823481) * V35
+  ( -0.0485362551) * V36
+  ( -0.0013188541) * V37
+  ( -0.0000293083) * V38
+  ( 0.0363060637) * V39
+  ( 0.1955400369) * V40
+  ( -0.047347462) * V41
+  ( -0.0015270668) * V42
+  ( -0.0000280312) * V43
+  ( 0.0374844045) * V44
+  ( 0.2034243571) * V45
+  ( -0.0490695545) * V46
+  ( -0.001562743) * V47
+  ( -0.0000257729) * V48
+  ( 0.0356067212) * V49
+  ( 0.2295057868) * V50
+  ( -0.0554446117) * V51
+  ( -0.001358813) * V52
+  ( -0.0000297109) * V53
+  ( 0.0360576991) * V54
+  ( 0.2335807895) * V55
+  ( -0.057674086) * V56
+  ( -0.0012250893) * V57
+  ( -0.0000281796) * V58
+  ( 0.0359835061) * V59
+  ( 0.2044141701) * V60
+  ( -0.0497405066) * V61
+  ( -0.0014426889) * V62
+  ( -0.0000279221) * V63
+  ( 0.0344531082) * V64
+  ( 0.2292608745) * V65
+  ( -0.0560774226) * V66
+  ( -0.0013385359) * V67
+  ( -0.0000285813) * V68
+  ( 0.0327802499) * V69
+  ( 0.2376574903) * V70
+  ( -0.060789287) * V71
+  ( -0.0009033281) * V72
+  ( -0.0000319059) * V73
+  ( 0.0326634905) * V74
+  ( 0.2335280133) * V75
+  ( -0.0602194339) * V76
+  ( -0.0008039851) * V77
+  ( -0.0000332166) * V78
+  ( 0.2517695408) * V79
+  ( 0.0288614891) * V80
+  ( -0.0452325063) * V81
+  ( -0.1714306687) * V82
+  ( -0.1264982609) * V83
+  ( 0.0993860626) * V84
+  ( 0.1877979312) * V85
+  ( 0.1738125876) * V86
+  ( 0.2516028069) * V87
+  ( 0.2084413729) * V88
+  ( 0.2546600658) * V89
+  ( -0.1684226782) * V90
+  ( 1.6390658205) * V91
+  ( 4.6441166049) * V92
+  ( 0.0000031823) * V93
+  ( -0.0000384455) * V94
+  ( -0.0010147409) * V95
+  ( 0.0810504064) * V96
+  ( -0.0019601569) * V97
+  ( -0.0024248405) * V98
+  ( 0.4495341746) * V99
+  ( 0.000038896) * V100

]







最佳答案

cheetahfly 查看完整内容

以下是测试结果,m是一个100,000*10的"dgeMatrix"类的矩阵,dt是把m转化成"data.table"类的变量,vec是一个代表系数的向量,测试代码如下: 第一种方法是data.table的运算,后两种方法分别用了%*%和tcrossprod(),两者相差不大,但比第一种data.table运算节省时间60%以上。
关键词:Table 运算速度 Data ABLE ABL
沙发
cheetahfly 在职认证  发表于 2017-8-22 00:40:43 |只看作者 |坛友微信交流群
以下是测试结果,m是一个100,000*10的"dgeMatrix"类的矩阵,dt是把m转化成"data.table"类的变量,vec是一个代表系数的向量,测试代码如下:
  1. microbenchmark::microbenchmark(dt[, logit:= vec[1]*V1 + vec[2]*V2 + vec[3]*V3 + vec[4]*V4 + vec[5]*V5 + vec[6]*V6 + vec[7]*V7 + vec[8]*V8 + vec[9]*V9 + vec[10]*V10], m %*% vec, tcrossprod(m, t(vec)), times = 30)
复制代码
第一种方法是data.table的运算,后两种方法分别用了%*%和tcrossprod(),两者相差不大,但比第一种data.table运算节省时间60%以上。
测试.png

使用道具

藤椅
calanthia 发表于 2017-8-22 01:42:09 |只看作者 |坛友微信交流群
没有测试速度,不过可以利用并行计算--


  1. Final_data_list <- split(Final_data, seq_len(nrow(Final_data))) # convert data to a list

  2. your_func_to_calc_logit <- function(dt){ # customize the function
  3.   (-7.0056794347) +
  4.     ( 0.0456494244) * dt$V1 +
  5.       ( 0.0757088261) * dt$V2 +
  6.         ( -0.0109480275) * dt$V3 + ...
  7. }

  8. tmp <- parallel::mclapply( # need to install `parallel`
  9.   Final_data_list,
  10.   your_func_to_calc_logit,
  11.   mc.cores=1 # set it to the total number of cores/cpus, e.g. 64
  12.   )

  13. ret <- do.call(rbind,tmp) # your column of logit
  14. Final_data[,logit:=ret]
复制代码

使用道具

板凳
rockfido 在职认证  发表于 2017-8-22 02:35:30 |只看作者 |坛友微信交流群
calanthia 发表于 2017-8-22 01:42
没有测试速度,不过可以利用并行计算--
sorry...我没有说清楚,老板还不让用并行。。。。因为有别的team说是用r data.table解决了大数据运算效率问题,说是只要ram够大,就没问题。。。可是我实在不知道他们是不是真的解决是我面临的类似的问题。。。。

(ps:我确实试过在10个core上面run,时间差不多能减到1/3,大概20s)

使用道具

报纸
rockfido 在职认证  发表于 2017-8-22 02:41:24 |只看作者 |坛友微信交流群
calanthia 发表于 2017-8-22 01:42
没有测试速度,不过可以利用并行计算--
sorry...忘记说了,老板要求不用并行。。。有其他组说他们解决了r data.table运行大数据的问题,只要ram够大。

(ps:我以前试过10个core,然后运行时间可以缩减到1/3的时间)

使用道具

地板
calanthia 发表于 2017-8-22 03:32:28 |只看作者 |坛友微信交流群
试试用`set`替代`:=`
  1. set(Final_data,j="logit",value=your_func_to_calc_logit(Final_data))
复制代码

或者使用`.SD`
  1. Final_data[,logit:=your_func_to_calc_logit(.SD)]
复制代码

使用道具

7
deem 学生认证  发表于 2017-8-22 08:06:52 |只看作者 |坛友微信交流群
写成向量和矩阵相乘的形式会改善吗?你的数据有没有大量的0-1变量?

使用道具

8
rockfido 在职认证  发表于 2017-8-22 08:46:35 来自手机 |只看作者 |坛友微信交流群
calanthia 发表于 2017-8-22 03:32
试试用`set`替代`:=`

或者使用`.SD`
好的,我试试后来汇报!谢谢!

使用道具

9
rockfido 在职认证  发表于 2017-8-22 08:47:01 来自手机 |只看作者 |坛友微信交流群
deem 发表于 2017-8-22 08:06
写成向量和矩阵相乘的形式会改善吗?你的数据有没有大量的0-1变量?
0-1的变量有,但不多。基本都是spline variables.

使用道具

10
cheetahfly 在职认证  发表于 2017-8-22 16:40:23 |只看作者 |坛友微信交流群
先问清楚一下:“100mm的record”是指100兆兆(100万亿)的记录吗?还是仅仅是100M(1亿)条记录?
还有,你现在想做的是商业应用(成本不敏感)还是学术上的公关?
谢谢!

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-17 08:19