2

首先让我说我所在的团队对 SAS 来说都是新手。我们在 SAS 9.3 中使用 Enterprise Guide 5.1,并有一组垂直排列的计划数据(每人每天一或两行)。我们有一些PROC SQL语句、aPROC TRANSPOSE和其他几个步骤,它们一起主要使数据按周分组并水平显示。那组代码工作正常。流程第一次运行时,建立与数据库的连接需要一点额外的时间,但是一旦建立连接,剩下的过程只需要几秒钟(7个月的测试运行大约需要6秒钟)数据:58,000 行和 26 列的源数据进入 6,000 行和 53 列的输出)。

我们的问题在于输出。最终用户在 Excel 中查找结果,因此我们使用 SAS Excel 插件并打开存储过程。为了获得输出,我们需要一个PROC PRINT,或类似的东西。但是使用PROC PRINT上面的结果(6,000 行 x 53 列)需要 36 秒才能生成。然后,在 EG 中渲染需要另外 10 秒左右,而在 Excel 中则需要更多时间。

代码很基础,只是:

PROC PRINT DATA=WORK.Report_1
    NOOBS
    LABEL;
RUN;

我们也尝试过使用 basic PROC REPORT,但我们只获得了 3 秒:生成加上渲染时间仍然需要 33 秒。

PROC REPORT DATA=WORK.Report_1
    RUN;
QUIT;

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

4

1 回答 1

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

于 2013-09-05T23:07:47.737 回答