All*_*owe 12 sas drop-table proc-sql
在SAS中删除表的最有效方法是什么?
我有一个循环和删除大量表的程序,并想知道PROC SQL之间是否存在性能差异; 和PROC DATASETS; 一次删除一个表..
或者如果有另一种方式或许???
cmj*_*hns 14
如果外包到操作系统是合理的,那可能是最快的.否则,我不科学的观察结果似乎表明滴表proc sql是最快的.这让我感到惊讶,因为我期望proc datasets最快.
在下面的代码中,我创建了4000个虚拟数据集,然后尝试使用不同的方法删除它们.第一个是用sql和我的系统花了大约11秒来删除文件.
接下来的两个都使用proc datasets.第一个为每个数据集创建一个delete语句,然后删除.第二个只发出一个删除命令来删除工作目录中的所有内容.(我原本以为这种技术最快).两个proc数据集例程报告大约20秒删除所有4000个文件.
%macro create;
proc printto log='null';run;
%do i=1 %to 4000;
data temp&i;
x=1;
y="dummy";
output;run;
%end;
proc printto;run;
%mend;
%macro delsql;
proc sql;
%do i=1 %to 4000;
drop table temp&i;
%end;
quit;
%mend;
%macro deldata1;
proc datasets library=work nolist;
%do i=1 %to 4000;
delete temp&i.;
%end;
run;quit;
%mend;
%macro deldata2;
proc datasets library=work kill;
run;quit;
%mend;
option fullstimer;
%create;
%delsql;
%create;
%deldata1;
%create;
%deldata2;
Run Code Online (Sandbox Code Playgroud)
我试图摆弄操作系统删除方法。
不推荐使用 X 命令删除。花了很长时间!
然后我在数据步骤中尝试使用系统命令:
%macro delos;
data _null_;
do i=1 to 9;
delcmd="rm -f "!!trim(left(pathname("WORK","L")))!!"/temp"!!trim(left(put(i,4.)))!!"*.sas7*";
rc=system(delcmd);
end;
run;
%mend;
Run Code Online (Sandbox Code Playgroud)
如您所见,我不得不将我的删除拆分为 9 个单独的删除命令。原因是,我使用通配符“*”,底层操作系统 (AIX) 将这些扩展为一个列表,然后列表变得太大而无法处理......
该程序基本上为九个文件组“temp[1-9]*.sas7*”中的每一个构建一个删除命令并发出该命令。
使用 cmjohns answer 中的 create macro 函数创建 4000 个数据表,我可以使用这种方法在 5 秒内删除它们。
因此,正如我所料,直接操作系统删除是批量删除的最快方法。