【问题标题】:SAS PROC PRINT is really slow for me, any ideas?SAS PROC PRINT 对我来说真的很慢,有什么想法吗?
【发布时间】:2013-09-05 20:56:44
【问题描述】:

首先我要说的是,我所在的团队对 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;

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

【问题讨论】:

  • PROC PRINT 需要多长时间才能打印到 HTML 文件(或仅打印到您选择的正常结果目的地),而不使用 Excel 插件?
  • 这有点帮助,但还是 28 秒。
  • 您的作品库在哪里?它是服务器本地的还是位于某处的文件共享上? %put %sysfunc(pathname(work)); 将打印当前工作库的路径。当临时空间位于慢速文件系统上时,我只见过这样的问题。
  • @EvilBob22 - 这不是为了帮助,而是测试excel是否是问题所在。它不是 - 所以它可能与你的数据集有关(就像 DomPazz 所指向的那样)。 PROC PRINT 本身不应该花费很长时间。
  • @Joe 很好,我不认为PROC PRINT 应该花那么长时间。

标签: sas


【解决方案1】:

在我的笔记本电脑上测试。用 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 装饰器。

【讨论】:

  • 这看起来很有希望。我们有可变数量的列,所以我将不得不对表的元数据进行一些处理以使其正常工作。利用此代码的初始测试从读取数据到操作,再到在 Excel 中在 51 秒内打印 6,000 个空白行。 (PROC PRINT 版本需要 4 分钟或更长时间。)
猜你喜欢
  • 1970-01-01
  • 2021-01-07
  • 1970-01-01
  • 2011-03-19
  • 2010-11-04
  • 2016-02-11
  • 2012-03-24
  • 1970-01-01
  • 2013-07-31
相关资源
最近更新 更多