質問

SASでテーブルを削除する最も効率的な方法は何ですか?

多数のテーブルをループしてドロップするプログラムがあり、PROC SQLの間にパフォーマンスの違いがあるかどうかを知りたい。およびPROCデータセット。一度に1つのテーブルを削除します。.

または別の方法がある場合は、おそらく???

役に立ちましたか?

解決

OSに外部委託するのが合理的である場合、それは最速かもしれません。そうでなければ、私の非科学的な観察結果は、 proc sql のドロップテーブルが最も速いことを示唆しているようです。 proc datasets が最速になると予想していたので、これは驚きました。

以下のコードでは、4000個のダミーデータセットを作成し、それらをすべて異なる方法で削除してみます。 1つ目はsqlを使用する方法で、私のシステムではファイルを削除するのに約11秒かかりました。

次の2つは両方とも procデータセットを使用します。最初は、各データセットに対して削除ステートメントを作成してから削除します。 2番目のコマンドは、ブランケットkillコマンドを発行して、作業ディレクトリ内のすべてを削除します。 (この手法が最速になると予想していました)。両方のprocデータセットルーチンは、4000ファイルすべてを削除するために約20秒を報告しました。

%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;

他のヒント

OS削除アプローチをいじろうとしました。

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;

ご覧のとおり、削除を9つの個別の削除コマンドに分割する必要がありました。理由は、ワイルドカード「" *」を使用しているため、基盤となるオペレーティングシステム(AIX)がこれらをリストに展開しますが、リストが大きすぎて処理できないためです...

このプログラムは、基本的に9つのファイルグループそれぞれについて削除コマンドを作成します" temp [1-9] *。sas7 *"コマンドを発行します。

cmjohns answerのcreate macro関数を使用して4000個のデータテーブルを作成すると、このアプローチを使用してわずか5秒でそれらを削除できます。

だから、オペレーティングシステムの直接削除は、私が予想したように、大量削除を行う最も速い方法です。

テーブルまたはデータセットについて議論していますか?

Tablesはデータベーステーブルを意味します。これらを迅速に取り除くには、proc SQLパススルー機能を使用するのが最速です。具体的には、データベースに一度接続してすべてのテーブルを削除できる場合は、切断します。

SASでデータセットについて議論している場合、proc sqlとprocデータセットは非常に似ていると主張します。アプリケーションの観点からは、両者は同じ控除を経て、ファイルを削除するシステムコマンドを作成します。 SASユーザーグループまたはプレゼンテーションから私が見たすべてのテストでは、あるメソッドを他のメソッドよりも使用することはわずかであり、多くの変数に基づいていることが常に示唆されてきました。

データセット/テーブルをドロップする絶対的な最速の方法が必要な場合は、テストする必要があります。 SASの各インストールとセットアップは、テストを保証するのに十分なほど異なります。

非常に大きなデータを除き、どちらの方が速いかという点では、両者の間にほとんど違いがないと思います。 ただし、永続的なSASデータセットを処理するときは、SQL実装ではなくSAS設計の方法を使用して永続的なデータセットを操作する方が良いと感じるため、PROC SQLではなくPROC DATASETSを使用します

同様の名前の一時テーブルの簡単なソリューション:

すべてのテーブルが同じプレフィックス(たとえばp1_table1とp1_table2)で始まる場合、次のコードはp1で始まるテーブルを削除します

procデータセット。     p1を削除します。 実行;

proc deleteは、文書化されていませんが、別の解決策です。

http://www.sascommunity.org/wiki/PROC_Delete

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top