提 升 SAS 效 率 的 小 技 巧 ( 二 ) 統 計 分 析 師 嚴 友 君 在 使 用 SAS 的 時 候, 效 率 的 考 量 除 了 程 式 運 行 的 時 間, 還 包 括 資 料 佔 用 的 空 間 暫 存 記 憶 體 的 使 用 量 程 式 的 長 度 與 易 讀 性 等 等 以 下 介 紹 一 些 初 學 者 容 易 應 用, 且 在 討 論 使 用 SAS 處 理 分 析 資 料 時 常 被 提 到 的 幾 個 小 技 巧 上 篇 ( 一 ) 介 紹 了 一 些 在 DATA step 部 分 可 應 用 的 技 巧, 本 篇 ( 二 ) 將 以 PROC step 的 部 分 為 主 承 上 篇 ( 一 ), 以 下 範 例 將 使 用 上 篇 技 巧 1 中 模 擬 的 資 料 檔 demo 資 料 檔 demo 的 資 料 型 式 如 下 : 1
技 巧 5: 避 免 除 以 0 的 運 算 在 做 除 的 運 算 時, 先 檢 查 除 數 的 數 值, 避 免 有 除 以 0 的 情 況 若 運 算 中 除 數 為 0,SAS 會 在 LOG 中 註 記 提 醒 並 將 運 算 結 果 設 定 為 遺 漏 值, 減 慢 程 式 的 執 行 效 率 範 例 5: 新 增 一 個 變 數 y5=x1/x3 程 式 1: 效 率 較 差 DATA slow; SET demo; y5 = x1/x3; PROC MEANS DATA=slow MEAN NMISS; VAR y5; NOTE: 在 line 74 column 12 偵 測 到 除 數 為 零 i=484 x1=78 x2=-19.00859113 x3=0 x4=4 x5=1 y5=. _ERROR_=1 _N_=484 NOTE: 在 line 74 column 12 偵 測 到 除 數 為 零 i=554 x1=18 x2=29.710669506 x3=0 x4=7 x5=1 y5=. _ERROR_=1 _N_=554 程 式 2: 效 率 較 佳 DATA fast; SET demo; IF x3 ne 0 THEN y5 = x1/x3; ELSE y5 =.; PROC MEANS DATA=fast MEAN NMISS; VAR y5; NOTE: There were 20000000 observations read NOTE: The data set WORK.FAST has 20000000 observations and 7 NOTE: DATA statement used (Total process 1:29.84 10.42 seconds WARNING: 已 達 到 ERRORS= 選 項 所 設 定 的 限 制 將 不 會 列 印 此 類 型 的 後 續 錯 誤 i=3240 x1=51 x2=11.608330497 x3=0 x4=4 x5=0 y5=. _ERROR_=1 2
_N_=3240 NOTE: 無 法 在 下 列 位 置 執 行 數 學 運 算 運 算 結 果 已 設 定 為 遺 漏 值 每 個 位 置 的 指 定 方 式 : 在 ( 行 ):( 欄 ) 的 ( 次 數 ) 159585 ( 位 於 74:12) NOTE: There were 20000000 observations read NOTE: The data set WORK.SLOW has 20000000 observations and 7 NOTE: DATA statement used (Total process 1:38.79 12.06 seconds 當 除 以 0 時,SAS 輸 出 的 結 果 為 缺 失 值 並 在 LOG 中 註 記 NOTE: 兩 個 程 式 的 結 果 會 相 同, 但 是 程 式 2 會 較 有 率 效 3
技 巧 6: 善 用 PROC step 中 的 WHERE 敘 述 許 多 的 PROC step 有 支 援 WHERE 敘 述, 當 我 們 在 使 用 此 類 PROC step 並 只 想 分 析 部 分 資 料 時, 應 善 用 WHERE 敘 述 使 用 WHERE 敘 述 可 不 必 為 了 此 分 析 執 行 DATA step 而 產 生 中 間 資 料 檔, 不 只 節 省 時 間 亦 節 省 空 間 例 如 PROC MEANS, PROC SUMMARY, PROC UNIVARIATE, PROC PRINT 等, 均 有 支 援 WHERE 敘 述 範 例 6: 以 PROC MEANS 分 析 變 數 x2, 但 只 需 要 分 析 x5 = 1 部 分 的 資 料 程 式 1: 效 率 較 差 DATA slow; SET demo; WHERE x5 in ("1"); PROC MEANS DATA=slow MAXDEC=2; VAR x2; NOTE: There were 6002755 observations read WHERE x5='1'; NOTE: The data set WORK.SLOW has 6002755 observations and 6 NOTE: DATA statement used (Total process 16.57 seconds 5.31 seconds 程 式 2: 效 率 較 佳 PROC MEANS DATA=demo MAXDEC=2; VAR x2; WHERE x5 in ("1"); NOTE: There were 6002755 observations read WHERE x5='1'; NOTE: PROCEDURE MEANS used (Total process 3.18 seconds 3.70 seconds NOTE: There were 6002755 observations read WORK.SLOW. 4
NOTE: PROCEDURE MEANS used (Total process 0.67 seconds 1.18 seconds 先 將 x5= 1 的 資 料 存 入 中 間 資 料 庫 slow, 再 做 PROC MEANS 分 析 若 未 來 不 再 需 要 此 中 間 資 料 庫 slow, 不 只 效 率 較 差 還 佔 用 空 間 直 接 提 取 資 料 庫 demo 中 x5 = 1 的 資 料 做 PROC MEANS 分 析 技 巧 7: 善 用 PROC step 中 的 CLASS 敘 述 許 多 的 PROC step 有 支 援 CLASS 敘 述, 當 我 們 在 使 用 此 類 PROC step, 並 希 望 分 析 結 果 依 某 變 數 分 組 呈 現, 應 善 用 CLASS 敘 述, 不 需 一 定 要 使 用 BY 敘 述 使 用 CLASS 敘 述 可 不 必 專 為 了 此 項 分 析 預 先 執 行 資 料 排 序, 當 資 料 尚 未 依 分 組 變 數 排 序 時, 使 用 CLASS 敘 述 便 省 下 了 執 行 排 序 所 需 的 時 間 例 如 PROC MEANS, PROC SUMMARY, PROC UNIVARIATE 等, 均 有 支 援 CLASS 敘 述 5
範 例 7: 以 PROC MENAS 分 析 變 數 x2, 並 依 變 數 x5 分 組 分 析 並 顯 示 結 果 程 式 1: 效 率 較 差 PROC SORT DATA=demo; BY x5; PROC MEANS DATA=demo VAR x2; BY x5; MEAN STD MAXDEC=2; NOTE: There were 20000000 observations read NOTE: The data set WORK.DEMO has 20000000 observations and 6 NOTE: PROCEDURE SORT used (Total process 1:09.90 36.82 seconds 程 式 2: 效 率 較 佳 PROC MEANS DATA=demo VAR x2; MEAN STD MAXDEC=2; CLASS x5; NOTE: There were 20000000 observations read from the data set NOTE: PROCEDURE MEANS used (Total process 4.00 seconds 7.65 seconds NOTE: There were 20000000 observations read NOTE: PROCEDURE MEANS used (Total process 7.61 seconds 4.21 seconds 6
使 用 BY 敘 述, 將 分 析 依 x5 分 組, 必 需 用 在 已 經 經 過 x5 排 序 後 的 資 料, 故 對 沒 有 經 x5 排 序 的 資 料 就 必 需 先 執 行 PROC SORT 排 序 使 用 CLASS 敘 述, 將 分 析 依 x5 分 組, 則 不 需 要 預 先 執 行 排 序 這 個 步 驟 技 巧 8: 使 用 PROC APPEND 取 代 SET 敘 述 追 加 資 料 當 有 新 的 個 案 進 來, 整 理 了 一 個 新 的 檔 資 料 檔 與 原 有 資 料 檔 有 相 同 的 變 數, 想 要 將 新 的 資 料 檔 追 加 於 原 有 資 料 檔 時, 可 以 使 用 SET 敘 述 或 PROC APPEND 使 用 SET 敘 述 時,SAS 會 兩 個 資 料 檔 均 讀 取 若 使 用 PROC APPEND 則 不 讀 取 BASE= 下 的 資 料 檔, 只 讀 取 DATA= 下 的 資 料 檔 故 使 用 PROC APPEND 會 較 有 效 率, 尤 其 是 在 BASE= 下 的 這 個 資 料 檔 相 當 大 的 時 候 7
範 例 8: 新 資 料 檔 new 與 原 資 料 檔 demo 有 相 同 的 變 數, 欲 將 資 料 檔 new 追 加 於 原 資 料 檔 demo, 更 新 資 料 檔 demo 程 式 1: 效 率 較 差 DATA new; DO i=9*1e6+1 TO 9*1E6+9*1E3; LENGTH x1 3; x1=floor(100*ranuni(0)); x2=25*rannor(0); x3=floor(50*rannor(0)); LENGTH x4 3; x4=ranbin(0, 30, 0.2); LENGTH x5 $1; x5=rand("bern", 0.3); OUTPUT; END; 程 式 2: 效 率 較 佳 DATA new; DO i=9*1e6+1 TO 9*1E6+9*1E3; LENGTH x1 3; x1=floor(100*ranuni(0)); x2=25*rannor(0); x3=floor(50*rannor(0)); LENGTH x4 3; x4=ranbin(0, 30, 0.2); LENGTH x5 $1; x5=rand("bern", 0.3); OUTPUT; END; DATA demo; SET demo new; NOTE: There were 20000000 observations read NOTE: There were 9000 observations read from the data set WORK.NEW. NOTE: The data set WORK.DEMO has 20009000 observations and 6 NOTE: DATA statement used (Total process 37.42 seconds 13.07 seconds PROC APPEND BASE=demo DATA=new; NOTE: 正 在 附 加 WORK.NEW 至 NOTE: There were 9000 observations read from the data set WORK.NEW. NOTE: 已 增 加 9000 個 觀 測 值 NOTE: The data set WORK.DEMO has 20009000 observations and 6 NOTE: PROCEDURE APPEND used (Total process 0.23 seconds 0.03 seconds 8
SAS 讀 入 資 料 檔 demo (2 千 萬 筆 資 料 ) 及 資 料 檔 new (9 千 筆 資 料 ), 再 做 粘 合 並 重 新 寫 入 demo 資 料 檔 SAS 只 讀 入 資 料 檔 new (9 千 筆 資 料 ), 追 加 至 demo 資 料 檔 並 寫 入 注 意 : 使 用 PROC APPEND 時, 若 兩 個 檔 案 變 數 不 同, 可 加 上 FORCE 選 項 FORCE 選 項 告 訴 SAS, 無 論 有 無 錯 誤, 都 強 制 執 行 PROC APPEND, 便 可 強 制 合 併 不 同 變 數 資 料 型 態 變 數 資 料 長 度 或 DATA= 下 的 資 料 檔 有 不 同 的 變 數 時 若 以 以 上 範 例 為 例, 程 式 可 以 寫 成 : PROC APPEND BASE=demo DATA=new FORCE; 但 因 上 例 中, 兩 個 資 料 檔 的 變 數 一 致, 故 不 用 加 FORCE 選 項 亦 能 正 確 執 行 9
後 記 以 上 的 幾 個 SAS 分 析 小 技 巧 為 理 論 上 一 般 情 況 SAS 運 行 較 有 效 率 的 方 法, 本 篇 提 供 的 測 試 實 例 只 是 在 特 定 軟 硬 體 環 境 資 源 下 的 某 一 次 結 果, 若 為 其 他 的 特 例 情 況 或 環 境, 較 有 效 率 的 技 巧 可 能 並 非 一 定 那 麼 有 效 率 但 是, 熟 悉 一 些 有 效 率 的 SAS 程 式 寫 法, 可 以 在 實 際 操 作 SAS 時, 判 斷 有 哪 些 不 同 的 方 法 可 以 達 成, 並 適 時 的 應 用 在 自 己 的 分 析 上 本 篇 使 用 SAS 9.3 版 本 進 行 主 要 參 考 資 料 : Bruce Gilsen (1999). SAS Program Efficiency for Beginners. In the SUGI 24, Beginning Tutorials Kirk Paul Lafler (2012). Top Ten SAS Performance Tuning Techniques. In the SAS Global Forum 2012, Systems Architecture and Administration 10