【SAS笔记】一个简单的速度测试(百万到上亿)

学SAS一段时间啦,想看下SAS的运行速度如何,做了一点简单的测试。我的版本:SAS9.4,电脑是8G的surface pro 4。

1,测试新建数据集的速度

1)100万以内的数据集新建几乎不到1秒就可以完成;

2)一亿条的数据CPU耗时4秒,实际时间6秒,在硬盘中可以看到,这样两列一亿条的数据集超过了2G。 

/*新建一个1万条的数据集*/
data test1;
do x=1 to 20000 by 2;y1=x**2;
output;
end;
run;
/*新建一个100万条的数据集*/
data test2;
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来做测试。

posted @ 2020-05-27 17:21  yoli2020  阅读(907)  评论(0)    收藏  举报