楼主: shewenhao
9662 30

[原创博文] 如何提高sas的data step的读取速度 [推广有奖]

21
shewenhao 发表于 2011-1-21 02:05:21
18# dchrenstu
感觉这个相对强度还是蛮重要的,因为你会发现日内扰动往往会随大盘而变化,但是如果观察k线,会发现一些股票如果相对大盘比较强势,往往会后市走强的概率蛮高。所以需要统计上进一步的研究。你看呢?

22
myzhang1982 在职认证  发表于 2011-1-24 09:25:40
16# shewenhao
我的不是多个dataset的问题,是只有一个很大的dataset,读入要花好长时间

23
情迷仲夏夜 发表于 2011-1-24 09:30:37
上传一段程序,也许会对你有所帮助:

%global libname dsn1 dsn2 dsn3 srcfile;

data fin;
   input libname $ dsn1 $ dsn2 $ dsn3 $ srcfile $;
   cards;
fy97v6 cen_fy97 cen97b cen97c cen97
fy97v6 cxm97 cxm97b cxm97c cxm97
fy97v6 ptf_fy97 ptf97b ptf97c ptf97
fy97v6 xm97 xm97b xm97c xm97
fy98v6 cen_98 cen98b cen98c cen98
fy98v6 excen_98 excen98b excen98c excen98
fy98v6 ptf_98 ptf98b ptf98c ptf98
fy98v6 xm98 xm98b xm98c xm98
fy98v6 obs_98 obs98b obs98c obs98
fy98v6 ext_98 ext98b ext98c ext98
fy98v6 cenobs98 cenobs98b cenobs98c cenobs98
run;

%macro dxfinptobs(libname, dsn1, dsn2, dsn3, srcfile);
   data &dsn2(keep=scrssn dxp v1-v10 srcfile dm);
      set &libname..&dsn1(obs=max);
      array aa dxp v1-v10;
      do over aa;
         if aa in ('250', '3572', '3620', '36641') then dm=1;
      end;
      srcfile="&srcfile";

   data &dsn3;
      set &dsn2;
      if dm=1;
   run;
%mend dxfinptobs;

%macro dsn;
   %do i=1 %to 11;
      data _null_;
         set fin;
         if _n_=&i then call symput('libname', libname);
            put libname=&libname;
         if _n_=&i then call symput('dsn1', dsn1); put dsn1=&dsn1;
         if _n_=&i then call symput('dsn2', dsn2); put dsn2=&dsn2;
         if _n_=&i then call symput('dsn3', dsn3); put dsn3=&dsn3;
         if _n_=&i then call symput('srcfile', srcfile);
      run;
      %dxfinptobs(&libname, &dsn1, &dsn2, &dsn3, &srcfile);
   %end;
%mend dsn;

%dsn;

24
情迷仲夏夜 发表于 2011-1-24 09:39:36
也许还有另一种办法,这个办法将所有文件是按照年限,先读成几个文件,如果需要,再继续合并成一个大文件:
%let vars=id date;

data sf97 sf98 sf99 sf00 sf01;
   id=.;
run;

%macro readsf(yr, infile);
   %if &yr=97 %then
      %do;
         data a;
            set fy97sf.&infile(keep=&vars);

         proc sort; by id;

         data sf97;
            set sf97 a; by id;
            if id=. then delete;
         run;
      %end;
   %else %if &yr=98 %then
      %do;
         data a;
            set fy98sf.&infile(keep=&vars);

         proc sort; by id;

         data sf98;
            set sf98 a; by id;
            if id=. then delete;
         run;
      %end;
   %else %if &yr=99 %then
      %do;
         data a;
            set fy99sf.&infile(keep=&vars);

         proc sort; by id;

         data sf99;
            set sf99 a; by id;
            if id=. then delete;
         run;
      %end;
   %else %if &yr=00 %then
      %do;
         data a;
            set fy00sf.&infile(keep=&vars);

         proc sort; by id;

         data sf00;
            set sf00 a; by id;
            if id=. then delete;
         run;
      %end;
   %else %if &yr=01 %then
      %do;
         data a;
            set fy01sf.&infile(keep=&vars);

         proc sort; by id;

         data sf01;
            set sf01 a; by id;
            if id=. then delete;
         run;
      %end;
%mend readsf;

%readsf(97, sf97v0102) %readsf(97, sf97v0304) %readsf(97, sf97v0506)
%readsf(97, sf97v0708) %readsf(97, sf97v0910) %readsf(97, sf97v1112)
%readsf(97, sf97v1314) %readsf(97, sf97v1516) %readsf(97, sf97v1718)
%readsf(97, sf97v1920) %readsf(97, sf97v2122)

%readsf(98, sf98_1) %readsf(98, sf98_2) %readsf(98, sf98_3)
%readsf(98, sf98_4) %readsf(98, sf98_5) %readsf(98, sf98_6)
%readsf(98, sf98_7) %readsf(98, sf98_8) %readsf(98, sf98_9)
%readsf(98, sf98_10) %readsf(98, sf98_11)

%readsf(99, sf990102) %readsf(99, sf990304) %readsf(99, sf990506)
%readsf(99, sf990708) %readsf(99, sf990910) %readsf(99, sf991112)
%readsf(99, sf991314) %readsf(99, sf991516) %readsf(99, sf991718)
%readsf(99, sf991920) %readsf(99, sf992122)

%readsf(00, sf00v0107) %readsf(99, sf00v0814)
%readsf(00, sf00v1518) %readsf(00, sf00v1922)

%readsf(01, sf010105) %readsf(01, sf010608) %readsf(01, sf010911)
%readsf(01, sf011214) %readsf(01, sf011517) %readsf(01, sf011820)
%readsf(01, sf012122)

25
情迷仲夏夜 发表于 2011-1-24 09:44:53
但我想不管用什么办法,所用的上千多个文件名总是不会被省略或被简写的,因为这些文件名有可能是间断或不连续的,甚至完全是不同,因而造成了所有的文件名不能用一个统一的方式变成loop而读入。

26
hongxx 发表于 2011-4-3 22:01:33
PROC APPEND 过程。

27
cathy3212 发表于 2011-6-21 21:05:45
你可以试试 proc append base=XX data=XX;run;这个不需要一行一行的读,比较快。

28
carfieldflying 发表于 2011-6-21 23:59:59
bufferno         晕 发不出去

29
醉_清风 发表于 2011-6-22 09:59:11
19# shewenhao view
从来不需要想起 永远也不会忘记

30
yugao1986 发表于 2011-6-22 15:33:16
不知道sasfile statement是否有效?
三人行必有我师

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-6 09:16