Pregunta

¿Cuál es la forma más eficiente de colocar una tabla en SAS?

Tengo un programa que repite y elimina una gran cantidad de tablas, y me gustaría saber si existe una diferencia de rendimiento entre PROC SQL; y PROC DATASETS; para dejar caer una sola tabla a la vez ...

¿O si hay otra forma quizás ???

¿Fue útil?

Solución

Si es razonable subcontratar al sistema operativo, eso podría ser más rápido. De lo contrario, mis observaciones no científicas parecen sugerir que drop table en proc sql es más rápido. Esto me sorprendió, ya que esperaba que los conjuntos de datos de proceso fueran más rápidos.

En el siguiente código, creo 4000 conjuntos de datos ficticios y luego intento eliminarlos con diferentes métodos. El primero es con sql y en mi sistema tardó unos 11 segundos en eliminar los archivos.

Los dos siguientes usan conjuntos de datos de proceso . El primero crea una declaración de eliminación para cada conjunto de datos y luego elimina. El segundo solo emite un comando blanket kill para eliminar todo en el directorio de trabajo. (Esperaba que esta técnica fuera la más rápida). Ambas rutinas de conjuntos de datos de proceso informaron aproximadamente 20 segundos para eliminar los 4000 archivos.

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

Otros consejos

Traté de jugar con el enfoque de eliminación del sistema operativo.

No se recomienda eliminar con el comando X. ¡Le llevó siempre

Luego intenté con el comando del sistema en un paso de datos:

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

Como puede ver, tuve que dividir mis eliminaciones en 9 comandos de eliminación separados. La razón es que estoy usando comodines, "*", y el sistema operativo subyacente (AIX) los expande a una lista, que luego se vuelve demasiado grande para que pueda manejar ...

El programa básicamente construye un comando de eliminación para cada uno de los nueve grupos de archivos "temp [1-9] *. sas7 * &"; y emite el comando.

Utilizando la función crear macro de la respuesta de cmjohns para crear 4000 tablas de datos, puedo eliminarlas en solo 5 segundos con este enfoque.

Entonces, una eliminación directa del sistema operativo es la forma más rápida de eliminar en masa, como esperaba.

¿Estamos discutiendo tablas o conjuntos de datos?

Tablas implica tablas de base de datos. Para deshacerse de estos de una manera rápida, usar la función de transferencia SQL proc sería lo más rápido. Específicamente, si puede conectarse a la base de datos una vez y soltar todas las tablas, desconecte.

Si estamos discutiendo conjuntos de datos en SAS, diría que los conjuntos de datos proc sql y proc son extremadamente similares. Desde el punto de vista de la aplicación, ambos pasan por la misma deducción para crear un comando del sistema que elimina un archivo. Todas las pruebas que he visto de grupos de usuarios o presentaciones de SAS siempre han sugerido que el uso de un método sobre el otro es marginal y se basa en muchas variables.

Si es imprescindible que tenga la forma más rápida de descartar los conjuntos de datos / tablas, es posible que deba probarlo. Cada instalación y configuración de SAS es lo suficientemente diferente como para justificar la prueba.

En términos de que es más rápido, excluyendo datos extremadamente grandes, apostaría a que hay poca diferencia entre ellos. Sin embargo, cuando manejo conjuntos de datos SAS permanentes, me gusta usar PROC DATASETS en lugar de PROC SQL, simplemente porque me siento mejor manipulando conjuntos de datos permanentes usando el método diseñado por SAS, y no la implementación de SQL

Solución simple para tablas temporales con nombres similares:

Si todas sus tablas comienzan con el mismo prefijo, por ejemplo p1_table1 y p1_table2, el siguiente código eliminará cualquier tabla que comience con p1

conjuntos de datos de proceso;     eliminar p1:; ejecutar;

proc delete es otra solución, aunque no documentada ...

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top