在SAS中删除表

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命令删除工作目录中的所有sas数据集:%macro osdel; 选项noxwait; %let p =%sysfunc(pathname(WORK,l)); x del"&p.\ temp*.sas7bdat"; %修补; %OSDEL; (3认同)

Mar*_*und 5

我试图摆弄操作系统删除方法。

不推荐使用 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 秒内删除它们。

因此,正如我所料,直接操作系统删除是批量删除的最快方法。