Question

Quel est le moyen le plus efficace de supprimer une table dans SAS?

J'ai un programme qui boucle et supprime un grand nombre de tables et je voudrais savoir s’il existe une différence de performances entre PROC SQL; et PROC DATASETS; pour laisser tomber une seule table à la fois.

Ou s'il y a un autre moyen peut-être ???

Était-ce utile?

La solution

S'il est raisonnable d'externaliser vers le système d'exploitation, c'est peut-être le plus rapide. Sinon, mes observations non scientifiques semblent suggérer que la table d’extraction dans proc sql est la plus rapide. Cela m'a surpris, car je m'attendais à ce que les ensembles de données proc soient les plus rapides.

Dans le code ci-dessous, je crée 4000 jeux de données factices, puis essaie de les supprimer avec des méthodes différentes. Le premier est avec SQL et sur mon système a pris environ 11 secondes pour supprimer les fichiers.

Les deux suivants utilisent ensembles de données proc . Le premier crée une instruction delete pour chaque ensemble de données, puis supprime. La seconde ne fait qu’émettre une commande blanket kill pour supprimer tout le contenu du répertoire de travail. (Je m'attendais à ce que cette technique soit la plus rapide). Les deux routines des ensembles de données proc ont indiqué qu'il fallait environ 20 secondes pour supprimer les 4 000 fichiers.

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

Autres conseils

J'ai essayé de manipuler l'approche de suppression de système d'exploitation.

La suppression avec la commande X ne peut pas être recommandée. Cela a pris pour toujours !

J'ai ensuite essayé avec la commande système dans un datastep:

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

Comme vous pouvez le constater, j’ai dû diviser mes suppressions en 9 commandes de suppression distinctes. La raison en est que j'utilise des caractères génériques, "*", et que le système d'exploitation sous-jacent (AIX) les développe en une liste, qui devient alors trop volumineuse pour pouvoir être traitée ...

Le programme construit en gros une commande de suppression pour chacun des neuf groupes de fichiers "" temp [1-9] *. sas7 *". et émet la commande.

En utilisant la fonction de création de macro de cmjohns answer pour créer 4000 tables de données, je peux les supprimer en seulement 5 secondes en utilisant cette approche.

Ainsi, la suppression directe du système d'exploitation est le moyen le plus rapide de supprimer en masse, comme je m'y attendais.

Nous discutons de tableaux ou de jeux de données?

Tables implique des tables de base de données. Pour se débarrasser rapidement de ces problèmes, l’utilisation de la fonction de transmission SQL proc serait la plus rapide. Si vous pouvez vous connecter à la base de données une seule fois et supprimer toutes les tables, déconnectez-vous.

Si nous discutons des jeux de données dans SAS, je dirais que les jeux de données proc sql et proc sont extrêmement similaires. Du point de vue de l'application, ils effectuent tous deux la même déduction pour créer une commande système qui supprime un fichier. Tous les tests que j'ai vus des groupes d'utilisateurs ou des présentations SAS ont toujours suggéré que l'utilisation d'une méthode plutôt que l'autre était marginale et basée sur de nombreuses variables.

S'il est impératif de disposer du moyen le plus rapide et absolu pour supprimer les jeux de données / tables, il vous suffira de le tester. Chaque installation et configuration de SAS est suffisamment différente pour justifier un test.

Pour ce qui est plus rapide, à l’exception des données extrêmement volumineuses, je parierais qu’il existe peu de différence entre elles. Cependant, lors de la manipulation de jeux de données SAS permanents, j'aime utiliser PROC DATASETS plutôt que PROC SQL, simplement parce que je me sens plus à l'aise de manipuler des jeux de données permanents à l'aide de la méthode conçue par SAS, et non de la mise en oeuvre SQL

Solution simple pour les tables temporaires portant le même nom:

Si toutes vos tables commencent par le même préfixe, par exemple p1_table1 et p1_table2, le code suivant supprimera toutes les tables dont le nom commence par p1

ensembles de données proc;     supprimer p1:; exécuter;

La suppression de proc est une autre solution, bien que non documentée.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top