- 阅读权限
- 255
- 威望
- 0 级
- 论坛币
- 2124 个
- 通用积分
- 247.2645
- 学术水平
- 15 点
- 热心指数
- 15 点
- 信用等级
- 15 点
- 经验
- 4683 点
- 帖子
- 208
- 精华
- 0
- 在线时间
- 203 小时
- 注册时间
- 2012-8-19
- 最后登录
- 2024-3-3
博士生
还不是VIP/贵宾
- 威望
- 0 级
- 论坛币
- 2124 个
- 通用积分
- 247.2645
- 学术水平
- 15 点
- 热心指数
- 15 点
- 信用等级
- 15 点
- 经验
- 4683 点
- 帖子
- 208
- 精华
- 0
- 在线时间
- 203 小时
- 注册时间
- 2012-8-19
- 最后登录
- 2024-3-3
|
10论坛币
- data work.a;
- array a(10) a1-a10;
- do i=1 to 1000000;
- do j=1 to 10;
- a(j)=normal(111);
- end;
- output;
- end;
- run;
- data _null_;
- sasfile work.a load;
- /*读入work.a的数据用于跟array部分一致的基准基础*/
- array x[1000000,10] _temporary_;
- array a[10] a1-a10;
- do i=1 to 1000000;
- set work.a;
- do j=1 to 10;
- x[i,j]=a[j];
- end;
- end;
- /* 代码正文 */
- do m=1 to 100;
- do until (eof);
- set work.a (firstobs=11) end=eof;
- y=20;
- a11=lag(a1);
- a22=lag2(a2);
- a55=lag5(a5);
- a77=lag7(a7);
- a1010=lag10(a10);
- pi = constant('PI');
- y1 = (a11-(5.1/(4*pi**2))*a22*a1010+5*a55/pi-6)**2;
- y2 = 10*(1-1/(8*pi))*cos(a77);
- rec= (y1+y2+10);
- end;
- put _all_;
- end;
- run;
- /*加array temp查看temp array在pdv的作用和效率*/
- data _null_;
- /*数据准备成array*/
- array x[1000000,10] _temporary_;
- array a[10] a1-a10;
- do i=1 to 1000000;
- set work.a;
- do j=1 to 10;
- x[i,j]=a[j];
- end;
- end;
- /*代码正文*/
- do m=1 to 100;
- do j=11 to 1000000;/*遍历全数据array*/
- y=20;
- pi = constant('PI');
- y1 = (x(j-1,1)-(5.1/(4*pi**2))*x(j-2,2)*x(j-10,10)+5*x(j-5,5)/pi-6)**2;
- y2 = 10*(1-1/(8*pi))*cos(x(j-7,7));
- rec= (y1+y2+10);
- end;
- end;
- run;
- sasfile work.a close;
复制代码
几个问题:
1、我用sasfile的dow loop的快,还是temp array快?因为考虑到一个是如果是temp array的话,数据全部进内存,但是如果读数据集的话会不会慢?另一个是如果temp array进内存的话,那么PDV是不是上面的情况dow loop dataset的PDV就会比temp array的短很多,那么会快不会快?
2、为什么dow loop的代码我想循环100遍set 不行?
3、有没有更好的方法,因为得重复计算data步,也就是说每计算一次都得set一遍,所以考虑array,但是array每次都得赋值。
|
|