【SAS笔记】一个简单的速度测试(百万到上亿)
学SAS一段时间啦,想看下SAS的运行速度如何,做了一点简单的测试。我的版本:SAS9.4,电脑是8G的surface pro 4。
1,测试新建数据集的速度
1)100万以内的数据集新建几乎不到1秒就可以完成;
2)一亿条的数据CPU耗时4秒,实际时间6秒,在硬盘中可以看到,这样两列一亿条的数据集超过了2G。
data test1;
do x=1 to 20000 by 2;y1=x**2;
output;
end;
run;
do x=1 to 2000000 by 2;y2=x**2;
output;
end;
run;
data test3;
do x=1 to 200000000 by 2;y3=x**2;
output;
end;
run;
2,测试数据集合并的速度
1)直接用merge来处理,耗时8秒;
/*100万的数据集去找1亿条数据集中的数据,用merge的方法,由于数据本来就是顺序,所以不再排序*/ data work.test4; merge work.test2 (in=a) work.test3 (in=b) by x; if a; /*if a 类似sql中left join*/ run;
2,用sql的left join来处理,耗时10秒;
/**100万的数据集去找1亿条数据集中的数据,通过sql中left join的方式*/ proc sql outobs=10 number; select a.x,a.y2,b.y3 from work.test2 as a left join work.test3 as b on a.x=b.x ; quit;
3,用sas的hash对象来处理,因为内存原因改为100万left join 2500万,耗时10秒。
有人说用hash对象可以快一点,但是不知道是不是我的数据集比较特殊,并没有发现什么优势,之后可以在实际工作中测试一下。
在测试过程中,我的电脑报错,内存中只能读入4400多万条数据,因此重新做了test3。
data work.test5; length x y3 8; if _n_ = 1 then do; declare hash myhash(dataset:"work.test3"); myhash.definekey('x'); myhash.definedata('y3'); myhash.definedone(); end; set work.test2; if myhash.find()=0 then output work.test5; run;
在学习hash对象的过程中犯错较多,log记录下来有如下问题及解决办法:
1,hash对象有未声明的“data”符“y3”
原因及解决办法:原来是因为我没有在data work.test5下面对hash对象中的x和y3进行定义,根据实际情况加上“length x y3 8”就行了。
2,data step组件对象失败,在“compilation”阶段中止(看中文完全不能理解,为啥不叫组建,这样的话可能更容易理解一点)
原因及解决办法:原来我把work拼写错了,写成了wrok,所以找不到相关的数据集,改回来就好了。
3,内存不足,报错内容如下:

原因及解决办法:理论上可以修改SASHome\SASFoundation\9.4\nls\u8\sasv9.cfg文件,把-WORK "!TEMP\SAS Temporary Files"下面的具体大小改成自己需要的,比如3G。但是我没有管理员权限,因此重新生成一个2500万条的test3来做测试。

浙公网安备 33010602011771号