SAS PROC PRINT对我来说真的很慢,有什么想法吗?

时间:2013-09-05 20:56:45

标签: sas

首先让我说我是一个对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;

任何想法为何花了这么长时间?还有其他可能更快的打印选项吗?

1 个答案:

答案 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装饰器。