Domanda

Qual è il modo più efficiente di eliminare una tabella in SAS?

Ho un programma che esegue il loop e rilascia un gran numero di tabelle e vorrei sapere se c'è una differenza di prestazioni tra PROC SQL; e PROC DATASETS; per aver lasciato cadere un solo tavolo alla volta ..

O se c'è un altro modo forse ???

È stato utile?

Soluzione

Se è ragionevole esternalizzare il sistema operativo, potrebbe essere più veloce. Altrimenti, le mie osservazioni non scientifiche sembrano suggerire che la tabella di rilascio in proc sql sia la più veloce. Questo mi ha sorpreso poiché mi aspettavo che set di dati proc fosse il più veloce.

Nel codice seguente, creo 4000 set di dati fittizi, quindi provo a eliminarli tutti con metodi diversi. Il primo è con sql e sul mio sistema ci sono voluti circa 11 secondi per eliminare i file.

I due successivi usano entrambi set di dati proc . Il primo crea un'istruzione di eliminazione per ciascun set di dati e quindi elimina. Il secondo emette semplicemente un comando kill kill per eliminare tutto nella directory di lavoro. (Mi aspettavo che questa tecnica fosse la più veloce). Entrambe le routine del set di dati proc hanno riportato circa 20 secondi per eliminare tutti i 4000 file.

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

Altri suggerimenti

Ho provato a giocherellare con l'approccio di eliminazione del sistema operativo.

L'eliminazione con il comando X non può essere consigliata. Ci sono voluti per sempre !

Ho quindi provato con il comando di sistema in 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;

Come puoi vedere, ho dovuto dividere le mie eliminazioni in 9 comandi di eliminazione separati. Il motivo è che sto usando i caratteri jolly, " * " ;, e il sistema operativo sottostante (AIX) li espande in un elenco, che diventa quindi troppo grande per essere gestito ...

Il programma fondamentalmente costruisce un comando di cancellazione per ciascuno dei nove filegroup "quot [1-9] *. sas7 * " ed emette il comando.

Usando la funzione di creazione della macro dalla risposta di cmjohns per creare 4000 tabelle di dati, posso eliminare quelle in soli 5 secondi usando questo approccio.

Quindi un'eliminazione diretta del sistema operativo è il modo più veloce per eliminare in massa, come mi aspettavo.

Stiamo discutendo tabelle o set di dati?

Le tabelle implicano le tabelle del database. Per sbarazzarsi di questi in modo rapido, utilizzare la funzione pass-through proc SQL sarebbe il più veloce. In particolare, se è possibile connettersi al database una volta e eliminare tutte le tabelle, quindi disconnettersi.

Se stiamo discutendo set di dati in SAS, direi che sia i set di dati proc sql che proc sono estremamente simili. Dal punto di vista dell'applicazione, entrambi eseguono la stessa deduzione per creare un comando di sistema che elimina un file. Tutti i test che ho visto da gruppi o presentazioni di utenti SAS hanno sempre suggerito che l'uso di un metodo rispetto all'altro è marginale e basato su molte variabili.

Se è indispensabile disporre del modo più rapido assoluto per eliminare i set di dati / tabelle, potrebbe essere necessario provarlo. Ogni installazione e configurazione di SAS è abbastanza diversa da giustificare i test.

In termini di quale è più veloce, escludendo dati estremamente grandi, scommetterei che c'è poca differenza tra loro. Quando gestisco set di dati SAS permanenti, tuttavia, mi piace utilizzare PROC DATASETS anziché PROC SQL, semplicemente perché mi sento meglio a manipolare set di dati permanenti utilizzando il metodo progettato da SAS e non l'implementazione SQL

Soluzione semplice per tabelle temporanee che hanno un nome simile:

Se tutte le tabelle iniziano con lo stesso prefisso, ad esempio p1_table1 e p1_table2, il codice seguente eliminerà qualsiasi tabella che inizia con p1

set di dati proc;     elimina p1:; eseguire;

proc delete è un'altra soluzione, anche se non documentata.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top