楼主: 阿扁V5
7615 3

[技术讨论与投票] SAS并行计算的几种方法 [推广有奖]

  • 1关注
  • 43粉丝

版主

山野小子

副教授

94%

还不是VIP/贵宾

-

威望
0
论坛币
-12310320 个
通用积分
3822.8538
学术水平
108 点
热心指数
119 点
信用等级
91 点
经验
49314 点
帖子
1168
精华
1
在线时间
651 小时
注册时间
2013-3-22
最后登录
2024-3-17

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币



sas在处理大数据集可能表现的让人着急,尤其不是在服务器而是在单机本地上的时候,参考网上的资料,经过亲身测试,这里我总结了SAS并行计算的几种方法如下:


1.编码优化
        这种方法要求比较高,需要对数据和算法深入的理解,掌握一定的优化策略,将某些循环设计为可并行的,这种难度相对较高,而且如果是优化现有的sas code,工作量将会非常大,所以这种方法我暂时未测试,感兴趣的可参考文献《SAS+软件中精确P+值计算的并行实现策略研究》https://wenku.baidu.com/view/a13637ae6f1aff00bed51e9c.html

2.options设置

SAS 9版本,是个革命性的版本,它提供了利用多CPU和多I/O的多线程任务计算,只需要在SAS或者不同的proc步中定义thread选项就可以实现高效的多线程运算。比如SORT, MEANS,SQL,SUMMARY, REG, and GLM等proc步与SAS/Access都是该技术的受益者。这里我测试了sort过程,本机是4核8G内存的。Sas code如下:


测试1:
libname fraud2 'F:\pxw\SAS_CODE\SAS_DATA\fraud2';
/*将THREADS参数设为yes, CPUCOUNT参数设为4,即表示用4个cpu并行计算*/
OPTIONS THREADS=YES CPUCOUNT=4;
PROC SORT DATA=SASUSER.TB_JXL_REPORT(OBS=1000000) OUT=fraud2.TEMP_TB_JXL_REPORT1;
BY REPORT_ID CLIENT_ID;
RUN;


日志:
NOTE: 从数据集 SASUSER.TB_JXL_REPORT. 读取了 1000000 个观测
NOTE: 数据集 FRAUD2.TEMP_TB_JXL_REPORT1 有 1000000 个观测和 141 个变量。
NOTE: “PROCEDURE SORT”所用时间(总处理时间):
      实际时间          7:59.57
      CPU 时间          2:35.98

测试2:
libname fraud2 'F:\pxw\SAS_CODE\SAS_DATA\fraud2';
/*将THREADS参数设为NO, CPUCOUNT参数设为1,即表示只用1个cpu计算*/
OPTIONS THREADS=No CPUCOUNT=1;
PROC SORT DATA=SASUSER.TB_JXL_REPORT(OBS=1000000) OUT=fraud2.TEMP_TB_JXL_REPORT2;
BY REPORT_ID CLIENT_ID;
RUN;

输出日志:
NOTE: 从数据集 SASUSER.TB_JXL_REPORT. 读取了 1000000 个观测
NOTE: 数据集 FRAUD2.TEMP_TB_JXL_REPORT2 有 1000000 个观测和 141 个变量。
NOTE: “PROCEDURE SORT”所用时间(总处理时间):
      实际时间          10:02.33
      CPU 时间          3:50.80


       从两个对比的测试结果来说,用一个cpu同样处理100万的数据所花的时间(实际时间10:02.33 CPU 时间3:50.80)是要明显要大于4个cpu所花的时间(实际时间7:59.57 CPU 时间2:35.98),但是测试结果并不是严格的遵循4:1的比例,甚至达不到2:1,本人猜测可能跟处理的逻辑计算复杂度和数据大小有关系,当你处理的数据越大逻辑越复杂,效果可能越明显。另外,一般来说CPUCOUNT参数不要超过本机的cpu个数。

3.CMD命令
        除了上述在sas的参数设置,还可以通过CMD命令来并行调用SAS文件,当然这调用的sas文件之间必须没有前后的依赖关系。具体方式如下:
Step1:按win键,在运行窗口输入cmd指令;
Step2:在cmd窗口,输入指令:START SAS.EXE –SYSIN “PROGRAM1.SAS”;
其中PROGRAM1.SAS是本地编好的sas文件,事实上,一般会包括一个物理地址指定具体的文件,如我的调用文件是:F:\pxw\SAS_CODE\PARALLEL_TET1.SAS,若想同时运行多个sas文件,则可依次在cmd命令窗口输入调用指令如下:

START SAS.EXE –SYSIN “F:\pxw\SAS_CODE\PARALLEL_TET1.SAS”;
START SAS.EXE –SYSIN “F:\pxw\SAS_CODE\PARALLEL_TET2.SAS”;
输出日志:
NOTE: 从数据集 SASUSER.TB_JXL_REPORT. 读取了 1000000 个观测
NOTE: 数据集 FRAUD2.TEMP_TB_JXL_REPORT1 有 1000000 个观测和 141 个变量。
NOTE: “PROCEDURE SORT”所用时间(总处理时间):
      实际时间          21:58.89
      CPU 时间          2:42.06

NOTE: 从数据集 SASUSER.TB_JXL_REPORT. 读取了 1000000 个观测
NOTE: 数据集 FRAUD2.TEMP_TB_JXL_REPORT2 有 1000000 个观测和 141 个变量。
NOTE: “PROCEDURE SORT”所用时间(总处理时间):
      实际时间          21:58.71
      CPU 时间          2:42.69


       其中PARALLEL_TET1.SAS是options中设置的测试1保存在本地的sas文件,PARALLEL_TET1.SAS是测试2的sas文件。日志一般会输出在c盘的用户文件夹,实在找不到可以搜索sas文件名.log,如parallel_test1.Log,可用记事本打开。
       从两个输出日志可以看出,两者所花的时间非常接近,他们是几乎同时完成的。但是我们需要注意一个问题,两者的实际时间接近22分钟,比options设置两者时间之和(8+10=18分钟)还多,但cpu时间不到测试1和测试2的cpu时间之和的一半。说明这种方法实际时间耗费的更多,可能是我本机其他进程占据了运行时间,但cpu耗费的时间更少,说明代码执行效率翻倍了。

       注1:如果是想依次执行sas文件,则只需在start后加/w,它控制sas文件必须先执行完第一个才能继续执行第二个,如:
START/W SAS.EXE –SYSIN “F:\pxw\SAS_CODE\PARALLEL_TET1.SAS”;
START/W SAS.EXE –SYSIN “F:\pxw\SAS_CODE\PARALLEL_TET2.SAS”;

       注2:我在CMD调用sas文件时,无法向sasuser写入数据,而临时文件夹work无法存储文件,所以建议用libname语句,另外建立一个临时逻辑库。

4.RSUBMIT语句
        最后一种是通过RSUBMIT命令来实现多个程序同时运行,不过这个需要有远程服务器。将你需要在服务器运行的语句包含在RSUBMIT…ENDRSUBMIT之间即可,在这之外的语句都将在本地运行。下面的例子是假设有一个很大的数据集,可根据性别分为两步进行统计,再讲结果合并在一起:

SIGNON TASK1 SASCMD="!SASCMD" INHERITLIB=(WORK=LOCWORK); * create server session 1;
RSUBMIT TASK1 WAIT=NO;
PROC MEANS DATA=DATASET;
WHERE GENDER=’M’;
OUTPUT OUT=MEANS_M;
RUN;
ENDRSUBMIT;


SIGNON TASK2 SASCMD="!SASCMD" INHERITLIB=(WORK=LOCWORK); * create server session 2;
RSUBMIT TASK2 WAIT=NO;
PROC MEANS DATA=DATASET;
WHERE GENDER=’F’;
OUTPUT OUT=MEANS_F;
RUN;
ENDRSUBMIT;
WAITFOR _ALL_ TASK1 TASK2; * wait for both tasks to complete before continuing;
DATA MEANSOUT;
SET MEANS_M MEANS_F;
RUN;






       由于我没有链接sas服务器,所以这里没办法进行测试,感兴趣的有条件的可以测试一下,是否真的有效,可以把结果贴过来让大家参考一下,也欢迎各位提出更好的解决方案。详细的可以参考这两个链接:
https://bbs.pinggu.org/thread-1257453-2-1.html
http://www.sfu.ca/sasdoc/sashtml/conn/zrsubmit.htm#footnote1


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:并行计算 continuing Procedure Parallel footnote

已有 1 人评分经验 学术水平 热心指数 信用等级 收起 理由
eijuhz + 20 + 2 + 3 + 2 精彩帖子

总评分: 经验 + 20  学术水平 + 2  热心指数 + 3  信用等级 + 2   查看全部评分

憧憬机器学习的世界!
沙发
512002855 发表于 2017-8-17 15:49:39 |只看作者 |坛友微信交流群
赞楼主的专业精神!

使用道具

藤椅
curlxp 发表于 2017-9-3 05:12:39 |只看作者 |坛友微信交流群
好神奇的想法!

使用道具

板凳
甲基橙crads 发表于 2018-9-18 11:02:10 |只看作者 |坛友微信交流群
问题是我只有一个cpu怎么办

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-24 09:41