Re: [問題] SAS跑大量資料所需的時間
※ 引述《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
討論串 (同標題文章)