自从在新的UTF-8
编码环境下运行我的SAS基础程序以来,我遇到了大量通过ODS excel
导出数据时的性能问题。
为给定的数据集导出超过N条记录通常会导致sas会话冻结,并且需要我重新启动客户端。
以下是我用于测试的内容,使用标准数据集并创建一个小的xlsx-File (<1MB):data test03;
set sashelp.zipcode;
if _N_ le 3000 then output;
run;
goptions device=png;
ods results=off;
ods excel
file = "/sas_p/gridshared/ch/eg_data/regel/group_hr/export/ods_export.xlsx"
options( flow = "tables" start_at = "A1" embedded_titles= "yes");
proc print data=test03 label noobs;
run;
ods _all_ close;
我逐渐增加_N_
(第3行),得到相应的cpu时间增加。然而,超过某一点(通常在大多数数据集的4位范围内),程序就会卡住。
对于上面的例子:
_N_ = 1000 rec → 00:00:09
_N_ = 2000 rec → 00:00:18
_N_ = 3000 rec → timeout
在旧的latin1
编码环境中没有这种行为,导出上述表的所有40k记录没有任何问题。
如果您在会话中强制数据集编码为wlatin1
并且ods输出也为wlatin1
会怎么样?
data test03(encoding='wlatin1');
set sashelp.zipcode;
if _N_ le 3000 then output;
run;
filename excelout "/sas_p/gridshared/ch/eg_data/regel/group_hr/export/ods_export.xlsx"
encoding='wlatin1'
;
goptions device=png;
ods results=off;
ods excel
file = excelout
options(flow = "tables" start_at = "A1" embedded_titles= "yes")
;
ods excel close;