首先让我说我是一个对SAS都很陌生的团队。我们在SAS 9.3中使用Enterprise Guide 5.1,并且有一组垂直排列的计划数据(每人每天一行或两行)。我们有一些PROC SQL
语句,PROC TRANSPOSE
和其他几个步骤,这些步骤主要使数据按周分组并水平显示。这组代码运行正常。第一次运行流程时,建立与数据库的连接需要一些额外的时间,但是一旦建立连接,其余的过程只需要几秒钟(对于7个月的测试运行大约需要6秒)数据:58,000行和26列源数据到6,000行,53列输出。
我们的问题在于输出。最终用户正在Excel中查找结果,因此我们使用SAS Excel加载项并打开存储过程。为了获得输出,我们需要PROC PRINT
或类似的东西。但是对上面的结果(6,000行x 53列)使用PROC PRINT
只需要36秒来生成。然后,在EG中再渲染10秒左右,在Excel中再渲染一次。
代码非常基本,只是:
PROC PRINT DATA=WORK.Report_1
NOOBS
LABEL;
RUN;
我们也尝试过使用基本PROC REPORT
,但我们只获得了3秒钟:生成加渲染时间仍需要33秒。
PROC REPORT DATA=WORK.Report_1
RUN;
QUIT;
任何想法为何花了这么长时间?还有其他可能更快的打印选项吗?
答案 0 :(得分:2)
在我的笔记本电脑上测试过。使用PROC PRINT和ODS HTML输出一个包含6000条记录和53个变量(我使用8个字符长字符串)的表格大约需要13秒。
data test;
format vars1-vars53 $8.;
array vars[53];
do i=1 to 6000;
do j=1 to 53;
vars[j] = "aasdfjkl;";
end;
output;
end;
drop i j;
run;
ods html body="c:\temp\test.html";
proc print data=test noobs;
run;
ods html close;
文件大小略低于11M。
如果您只将其用作存储过程,则可以将其设为流式处理并写入_WEBOUT HTML。这将适用于在Excel中查看,并大大减少生成的HTML的大小(不包括CSS)。
data _null_;
set test end=last;
file _webout;
array vars[53] $;
format outstr $32.;
if _n_ = 1 then do;
put '<html><body><table>';
put '<tr>';
do i=1 to 53;
outstr = vname(vars[i]);
put '<th>' outstr '</th>';
end;
put '</tr>';
end;
put '<tr>';
do i=1 to 53;
put '<td>' vars[i] '</td>';
end;
put '</tr>';
if last then do;
put '</table></body></html>';
end;
run;
这需要0.2秒才能运行并产生6M的输出。根据需要添加任何HTML装饰器。