作者liton (欧吉桑留学生)
看板Statistics
标题Re: [问题] SAS跑大量资料所需的时间
时间Wed Mar 18 22:45:23 2009
※ 引述《liton (欧吉桑留学生)》之铭言:
: 标题: Re: [问题] SAS跑大量资料所需的时间
: 时间: Wed Mar 18 01:30:47 2009
:
: ※ 引述《azimuth ()》之铭言:
: : ※ 引述《liton (欧吉桑留学生)》之铭言:
: : 原始资料: 6年交易纪录76,113,236笔 (不用怀疑!)
: : 光是用一个PROC SQL筛出一个帐户的资料就耗掉快3分钟
: : 简化的程序如下:
: : PROC SQL ;
: : CREATE TABLE no39 AS
: : SELECT *,
: : PUT(var1,DATE9.) AS time1 LENGTH=9 LABEL="时间1" ,
: : PUT(var2,MONYY7.) AS time2 LENGTH=7 LABEL="时间2" ,
: : var3 AS time3 FORMAT=TIME. LABEL="时间3" ,
: : var4 AS time4 FORMAT=TIME. LABEL="时间3"
: : FROM readall49
: : WHERE acc_no=39;
: : QUIT;
: : PROC SORT DATA=no39 ;
: : by var1 var2 var3 var4 ;
: : RUN;
:
: 1.你浪费太多时间在acc_no ne no39上
: 先用acc_no筛选资料看看
: 然後再来处理那些数值运算
:
: 2.需要sort吗?
: 塞order进去sql不就好了?
:
: --
:
※ 发信站: 批踢踢实业坊(ptt.cc)
: ◆ From: 118.167.189.144
: → west1996:where不是会比数值运算先执行? 03/18 07:46
抱歉 前篇快睡着了没说清楚
我前面两篇有说到一个技巧
搜寻数字会比搜寻文字快
如果acc_no真的是数字 那这技巧又没用
但一般而言 帐号资料会是文字格式
所以我的建议是先做个数字编码的对照表
例如:
acc_no key
"A122342231" 1
"B211324121" 2
然後塞回readall49
当然前提是你不是在你最重要的moment来执行这一段
而是先前在做资料大表或universe的时候就搞定
然後到时候先找出对照表的key再去搜寻
: 推 azimuth:我知道可以把sort跟sql合写.而"先用acc_no"筛选readall49 03/18 10:14
: → azimuth:的意思我不太懂 有什麽具体做法吗? 请大大指教 谢谢 03/18 10:14
: → azimuth:另外我是按acc_no大小从readall49抓出观察值,如果我先对 03/18 10:16
: → azimuth:readall49按acc_no排序 这样系统处理会比较快吗? 03/18 10:16
sort最有效的地方
是在资料合并的时候
如果你的资料是
A table B table
key column_A key column_B
1 ada 6 jjl
3 dsa 3 enco
2 dsaf 2 3da
SQL在串的时候可是
A table的key扫完全部B table的key
也就是1->6 1->3 1->2 3->6 3->3 3->2 ....
但是如果先sort再merge 扫的流程是
1X 2->2 2X 3->2 3->3 3X
所以在你的情况下 有没有sort完全没差
不然你这段程式用SAS data写的话 SAS会挡你吗?
执行一大堆SAS指令 出现error说你没先 sort而档掉你程式就是这原因
效率差的程式SAS是会挡的
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.167.189.144