msgbartop
List for SAS fans and programmer
msgbarbottom

27 7月 12 SAS十大性能优化技术 翻译


这是2012年SAS全球用户大会的一篇文章,主要讲编程时注意哪些问题,才能提高SAS程序的执行效率,很显然,一篇文章很难讲全SAS代码优化的全部技术,这里只是作者本人和他调查周围的程序员的一些经验总结,有很多方面并没有考虑到,如硬件情况。但是作为一篇入门级的SAS代码优化文章来读,还是很不错的。 原文链接:http://support.sas.com/resources/papers/proceedings12/357-2012.pdf

SAS十大性能优化技术

翻译 by 空谷幽兰 修改 by sxlion

摘要

SAS/BASE模块为用户读取、处理、分析、整理和生成高质量的数据和结果提供了多种选择。部分由于SAS软件提供的功能和数据源规模的原因,许多应用开发员和最终用户都需要更高效的用户指南。本篇文章列举了我个人认为SASor实施开发应用过程中最重要的前十种性能优化和编程技术。参加者学习DATA和PROC步语句和选项将有助于完成涉及数据整理,排序,分组,合并和汇总相关任务,并同时节省CPU, I/O,数据存储空间和内存资源。

引言

在编写SAS代码和/或应用程序时,代码的高效性不总是受到开发者的重视,尤其是在开发的初期阶段。应用程序的执行情况极大地受系统性能影响。理解应用程序和系统性能需求对于活跃开发员的非常重要。

应该注意每一个程序单元以使其符合高效性能评估准则。了解用户的期望(最好在应用程序开发过程的初期阶段)往往有助于开发更有效的应用程序。这样,在应用程序接近完工时提高程序效率的难度往往是最小的。本文列举了使用SAS软件时可以提高应用程序性能的几个重要方面。

Efficiency Objectives 效率导向

在实施SAS性能优化时,执行效率导向应该尽早达到,最好就是在设计阶段。但是不能在设计阶段进行,比如修改或者集成一个完成的程序的时候,应用效率导向同样可以获得一定程度的提高。效率和性能策略可以分为五个方面:CPU时间,数据存储空间(Data storage),执行时间(elapsed time),读入/读出(I/O)和内存。

SAS软件研究所的Jeffrey A. Polzin这样评价效率测试,“CPU时间和使用时间是基准测量结果,因为所有其他的测量都对这两种测量数据有这样或那样的影响。”他继续说,“…这两个测量指标,如果一个降低或增加,都会在不同程度上对其他测量产生影响。”

违背最基本的编程规范会掉入一个或多个效率的陷阱,例如在临时数据集空间中保留无用数据集、或没有提前提取子数据集以减少总数据条数、或同时读取必须的和不需要的变量。通过在编码之前开始更好的规划和认识什么可行和什么不需要优先,可以很大程度上避免导致一个应用程序效率低效。大多数人没有计划导致失败或者说他们计划失败。幸运的是可以通过学习以下几条编程指南来实现效率提高。

Guidelines to Hold Dear 重视指导方针

一个程序的执行性能在优化前后常常表现出巨大的差异。通过坚持可行的原则,一个程序可以获得高效率,这将直接带来大量资源的节约。一般情况下,90%的效率提升可以通过相对容易的简单策略快速达到。但是,剩下的10%将具有难度。因此,你需要判断应用程序是否达到了“相对”最佳效率,同时保持时间和成本之间的虚拟平衡。 http://saslist.net/

以下这些建议并不是所有已知高效技术的列表汇总,但是作为行之有效的方法还是可以提高一些效率的。根据以下资源:CPU时间,数据存储空间,I/O,内存和编程时间的性能优化技术在这里列出,选择的编程示例如表1所示。

CPU Time /CPU时间

  • 1)使用数据集选项KEEP= 或者DROP=以保留需要的变量。
  • 2)使用WHERE语句,数据集选项WHERE=,或WHERE子句得到SAS数据子集。
  • 3)创建和访问SAS数据集,而不是ASCII和EBCDIC原始数据文件。
  • 4)使用数据步中的IF-THEN/ELSE或SELECT-WHEN/OTHERWISE条件语句,或PROC SQL中的Case表达式进行有条件的处理数据。
  • 5)使用DATASETS过程步的COPY语句复制带有索引的数据集。
  • 6)在合适的时候使用如PROC SQL程序整合过程步。
  • 7)在不需要的时候关闭宏指令。http://saslist.net/
  • 8)避免不必要的排序,计划使用。
  • 9)使用支持CLASS语句的过程步,以使用在不排序情况下进行分组处理功能。
  • 10)对于复杂数据步,使用存储程序工具(Stored Program Facility)。

——————下面是两个更好的办法——-————

  • 11)可以通过使用SASFILE语句减少CPU占用时间和程序执行时间。
  • 12)使用数据步的哈希编程技术合并SAS数据集。

Data Storage 数据存储空间

  • 1)使用数据集选项KEEP=或DROP=保留所需要的变量。
  • 2)仅处理需要的变量,将不需要的变量从程序数据向量(PDV)中删除。
  • 3)使用LENGTH语句减少变量的长度。
  • 4)使用数据压缩策略减少总的存储数据集的存储空间大小。
  • 5)对于不用于分析目的的变量可以设置成字符变量。
  • 6)使用informats和formats减小数据
  • 7)当写入到外部文件时使用空数据集DATA _NULL_。
  • 8)当使用默认的6KB的物理BLKSIZE时,往往需要更多的DASD空间以装载特定大小的的数据。
  • 9)当磁盘空间不足,无法执行排序过程时,可以考虑使用SORT过程的TAGSORT选项。
  • 10)使用PROC DATASETS删除不必要的SAS数据集。

I/O

  • 1)仅从外部数据源中读取需要的数据。
  • 2)在单一数据步建立子数据集,尽量减少读取大数据集的次数。
  • 3)使用数据集选项KEEP=或DROP=选项保留需要的变量。
  • 4)使用WHERE语句分割数据。
  • 5)对大型数据集进行数据压缩。
  • 6)使用DATASETS过程步的COPY语句复制带有索引的数据集。
  • 7)使用SQL过程整合各个步骤。
  • 8)用SAS数据集的形式存储数据,而不是外部文件,以避免过度的读入操作。
  • 9)尽早使用子数据集以减少读入次数.
  • 10)使用索引数据集,以提高访问子数据集的效率。

——————两条更多好措施——————

  • 11)使用PROC SORT语句中的out=选项,以减少I/O操作。
  • 12)尝试使用BUFNO=选项的不同取值以调整在处理SAS数据集时打开页面缓冲区的次数。

Memory 内存

  • 1)只读取需要的数据。
  • 2)仅处理需要的变量,将不需要的变量从程序数据向量(PDV)中删除。
  • 3)当需要的时候,使用WHERE语句,WHERE数据集选项,或WHERE子句得到数据子集。
  • 4)尽量避免在内存中存储SAS目录,因为这种目录将占用大量的内存。
  • 5)如果使用数组,使用_TEMPORARY_临时数组,以减少内存需要。
  • 6)当内存不足时需要增加REGION的大小。
  • 7)使用SORTSIZE=系统选项限制用来排序的内存量。
  • 8)使用SUMSIZE=系统选项限制汇总程序可用的内存量。
  • 9)使用MEMSIZE=系统选项限制SUMMARY过程可用的占用内存量。
  • 10)使用MVARISE=系统选项指定内存宏变量值的最大字节数。

Programming Time 编程时间

  • 1)使用SQL语句简化代码。
  • 2)尽可能使用已有的PROC过程步。
  • 3)给程序和例程做好注释。
  • 4)用宏代替重复代码。
  • 5)为未知的数据值编码。
  • 6)给变量取具有描述性和有意义的名字。
  • 7)保存和使用SAS数据集的格式和标签
  • 8)使用COPY语句DATASETS过程复制带有索引的数据集。
  • 9)使用完整的测试数据调试代码。http://saslist.net/
  • 10)在关键功能代码处设置冗余代码步,特别是在调试和调整优化阶段。

调查结果

对参与者对效率和性能所引起的反映进行了一项调查。表2是对效率和性能的调查结果,对每个参与者的反映进行分析提供了更好地了解当使用者和应用程序开发者在使用有效的方法和策略时的需要。

展开该项调查的首要目的是得到人们所掌握的各种提高效率的方法和技巧的共识理解水平。发现的东西相当有趣。大多数用户和应用开发员希望他们的应用程序尽可能高效。许多人都尽力实施稳健的策略和技巧,结果也能取得理想的成果。不幸地是其他人,由于对高效技术不熟悉导致应用程序可以运行,至于是否高效就不得而知了。

受访者经常指出,效率和性能优化不仅重要,而且对编程来说非常关键。许多人将响应时间当作程序运行的关键指标,并一直寻找各种方法来提升该指标。希普咨询(Shipp Consulting)的Charles Edwin Shipp 对效率技巧的运用方面提了一些意见,“效率不应该被视为一次性活动。最好将它作为在资源利用和使用频率之间达到最佳平衡的一个持续不断的过程。”

程序代码示例

    下面的程序例子演示了几个比较受欢迎的效率技巧的应用程序。这些技巧通过占用CPU时间,数据存储,I/O,内存和编程时间几个方面展现出来。

1.使用KEEP=数据集选项指导SAS系统加载指定的变量到程序数据向量(PDV),删除所有其他正在加载的变量。data af_users;set sands.members(keep=name company phone user);

if user = ‘SAS/AF’;

run;

put @10 item $20.@35 sales comma6.2;return; h: rptdate=today();

pageno + 1;

put @20 ‘Sales Report’

/ @1 rptdate mmddyy10.

/ @30 ‘Page ‘ pageno 4. //;

return;

run;

2.Class语句可以分组处理数据,而不需要提前对数据进行单独排序操作。因此,当数据未根据需要的顺序排好时可以节省CPU时间。CLASS语句可以在MEANS和SUMMARY步使用。proc means data=mortgage;var prin interest;class state;

run;

5.对无需提前进行数据步的数据子集,可以在过程中使用WHERE语句。I/O和内存对WHERE语句的要求会较低。proc print data=af_users n noobs;where user = ‘SAS/AF’;title1 ‘SAS/AF Programmers/Users’;

run;

3.通过使用IF-THEN/ELSE语句而不是未带ELSE的IFTHEN语句,一旦任何观测的条件为真时,SAS系统将停止处理条件逻辑。  data capitols;   set states;if state=’CA’ then capitol = ‘Sacramento’;

else if state=’FL’ then capitol = ‘Tallahassee’;

else if state=’TX’ then capitol = ‘Austin’;

  run;

6.使用SQL过程对编码要求进行简化和整合代码。可能会节约CPU,I/O和编程时间。.net/proc sql;title1 ‘SAS/AF Programmers/Users’;select * from sands.members

where user = ‘SAS/AF’

order by name;

quit;

4.避免在SAS数据集中使用默认的变量长度,使用LENFTH语句改变长度。将包含整数的变量默认8字节长度改为合适的长度将显著的减少空间使用,从而节约大量的存储空间。data _null_;length pageno rptdate 4;set sales;

file report header=h;

7.为了改善数据存储和I/O要求,可以考虑压缩大型数据集。data sands.members (compress = yes);< additional statements >run; 

其他普遍接受的技术包括WHERE,LENGTH,LCLASS和KEEP=/DROP=数据集选项,保留应用程序需要的变量;避免不需要的排序;使用IDXNAME=或IDXWHERE=OPTION验证简单的且/或复合索引的效率;使用SAS函数;使用能够提高应用程序效率的有效技术DATA_NULL_步。

接受度较高的技术(在“有时”和“总是”之间)并未获得包括使用系统选项控制资源的参与者的一致支持;删除不必要的WORK逻辑库中的数据集;将两个或更多步骤整合成一个步骤;存储和使用输入和输出格式;创建和使用由判别变量组成的简单和复杂的索引;使用APPEND过程连接两个数据集;构建IF-THEN/ELSE语句改善条件处理过程;保存中间文件,尤其是大型多步工作。

古普塔编程(Gupta Programming)的苏尼尔·库马尔古普塔(Sunil Kumar Gupta)关于设置输入格式,输出格式和标注提出了以下建议“用SAS数据集存储输入格式,输出格式,标注,以减少处理时间。使用这项技术的原因为许多流行的程序在输出时使用存储的输出格式,无需在每个步骤都设置它们。这向程序员和最终用户提供了额外的动机,尤其是报告要求在关键的时候”。

被更多用户使用的实现更高效率的一个非常有趣的方法是使用SQL Pass-Through Facility 访问在一个或多个数据库环境中存储的数据。对用户来说好处为可以使得所有过程都在主机上的数据库进行,(例如,Oracle,DB2,Access等),这也是所有过程应该的。此外,SAS软件和与其相关的处理资源消耗会自动传送到主机数据库以获得更高的效率。

被调查参与者称为“有时”使用的实现高效率的技术包括使用数据集选项,使用数据压缩,通过关闭不必要的组件和/或选项节省内存,使用SQL过程整合和简化多项操作,使用Stored Program Facility,当重复数据较多时创建和使用数据和SQL视图控制环境;使用DATASETS过程步的COPY语句来操作一个多个索引。http://saslist.net/

学习必要的技术

人们如何了解有效的技术?小部分人通过正规培训学习,其他通过公开发表的指南(例如,书籍,手册,文章等)。大多数人表示他们学习技术是前人的经验,通过熟人(例如,用户组)和/或自己工作总结的。

任何改善优于没有改善。因此,坚持一套实用的指引可以在未来几年里明显受益。调查问卷回答发现了以下问题:

1)正规培训在效率和性能方面存在水平不足。

2)在编码阶段之前未做计划。

3)时间和预算不足往往可以归因于无效的规划和效率战略的实施。

结论

应用程序的执行效率和性能策略的价值不能过度强调。应该小心每个应用程序的功能,因为一个或更多效率技术经常影响应用程序的框架特点和/或应用的特性。

效率技术可以通过各种不同的方式学得。许多人通过正规课堂教学学习有价值的技术,然而其他人在公布的指南,诸如书籍,手册,文章和录像带中发现有价值的信息。但是最有价值的技术来自其他人的经验,以及他们自己的,口头叙述和在工作中学得。不管什么方式,都会有一点点的效率。http://saslist.net/

参考文献

致谢

笔者想感谢系统架构及行政主席Donald (D.J.) Penix接受我的摘要和文章。感谢SAS全球论坛(简称SGF)2012年的会议主席Andrew Kuligowski。

商标说明

SAS和其他所有SAS研究所公司的产品或服务名称为在美国和其他国家的注册商标或SAS研究所的商标。®表示在美国注册。其他商标和产品名称为他们各自公司的商标。

作者简介

Kirk Paul Lafler是职能软件公司的创始人和顾问,并自1979年以来一直使用SAS软件。他是SAS认证专业人员,IT服务咨询的提供商,全球SAS用户的培训师,sasCommunity.org咨询委员会成员。作为四本书的作者,包括PROC SQL:Beyond the Basics Using SAS,Kirk已经写了近五百篇同行审评的论文,已经是三百多个SAS国际,区域,当地和特殊兴趣的用户组会议的特邀发言人和培训师,是19“最佳”贡献论文,实践研讨会和海报奖励的接受者。他的受欢迎的SAS Tips column,“Kirk’s Korner of Quick and Simple Tips”,经常出现在SAS用户组的简讯和网站上,且他的fun-filled SASword Puzzles 一书在SAScommunity.org网站上也是一个特色。

意见和建议可以发送到:

Kirk Paul Lafler

智能软件公司 Software Intelligence Corporation

E-mail:KirkLafler@cs.com

原创文章: ”SAS十大性能优化技术 翻译“,转载请注明: 转自SAS资源资讯列表

本文链接地址: http://saslist.net/archives/276


Leave a Comment

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据