2009-04-29 25 views
12

Qual è il modo più efficiente per rilasciare una tabella in SAS?Eliminazione di una tabella in SAS

Ho un programma che esegue il loop e rilascia un numero elevato di tabelle e vorrebbe sapere se esiste una differenza di prestazioni tra PROC SQL; e PROC DATASET; per far cadere un solo tavolo alla volta ..

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

+1

Si * potrebbe * basta eliminare la tabella SAS fisica file (e indici) con una chiamata al sistema operativo. Non ho idea di come funzioni, ma mi aspetto che un filesystem raw-delete sia il più veloce. –

risposta

13

Se è ragionevole esternalizzare il sistema operativo, potrebbe essere il più veloce. Altrimenti, le mie osservazioni non scientifiche sembrano suggerire che il drop table in proc sql sia il più veloce. Questo mi ha sorpreso perché mi aspettavo che il proc datasets 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 sono stati necessari circa 11 secondi per eliminare i file.

I due successivi utilizzano entrambi proc datasets. Il primo crea un'istruzione delete per ogni set di dati e quindi elimina. Il secondo emette semplicemente un comando kill generale per eliminare tutto nella directory di lavoro. (Mi aspettavo che questa tecnica fosse la più veloce). Entrambe le routine dei dataset proc hanno riportato circa 20 secondi per cancellare 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; 
+0

Come intendete esternalizzare il sistema operativo? Intendi tramite un comando X? –

+3

Sì, e sembra più veloce, specialmente se stai cancellando un'intera directory. Ad esempio - questo elimina tutti i dataset sas della directory di lavoro usando il comando x: % macro osdel; opzioni noxwait; % let p =% sysfunc (pathname (WORK, l)); x del "& p. \ Temp * .sas7bdat"; % ripara; % osdel; – cmjohns

+0

correggendo il mio commento precedente - intendevo dire che cancella tutti i set di dati sas nella cartella di lavoro che iniziano con "temp" (poiché quello era il prefisso che ho usato nel mio test nella mia risposta). – cmjohns

2

Stiamo discutendo di tabelle o set di dati?

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

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

Se è assolutamente necessario disporre del modo più rapido per rilasciare i set di dati/tabelle, è sufficiente testarlo. Ogni installazione e configurazione di SAS è abbastanza diversa da giustificare il test.

+0

d'accordo - Mi chiedevo solo se un metodo fosse più veloce nel complesso ... –

4

Ho provato a giocare con l'approccio OS-delete.

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

Allora ho 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 potete vedere, ho dovuto dividere il mio eliminazioni in 9 comandi di cancellazione separati. Il motivo è che sto usando i caratteri jolly, "*", e il sistema operativo sottostante (AIX) li espande in un elenco, che diventa troppo grande per essere gestito ...

Il programma costruisce fondamentalmente una cancellazione comando per ciascuno dei nove filegroup "temp [1-9] *. sas7 *" e invia il comando.

Utilizzando la funzione di creazione macro dalla risposta di cmjohn per creare 4000 tabelle di dati, è possibile eliminarle in soli 5 secondi utilizzando questo approccio.

Quindi, l'eliminazione diretta del sistema operativo è il modo più rapido per eliminare la massa, come previsto.

2

in termini di che è più veloce, ad esclusione estremamente dati di grandi dimensioni, vorrei scommettere che c'è poca differenza tra di loro. Durante la gestione di set di dati SAS permanenti, tuttavia, mi piace utilizzare PROC DATASETS anziché PROC SQL, semplicemente perché mi sento meglio manipolare i set di dati permanenti utilizzando il metodo progettato da SAS e non l'implementazione SQL

2

Soluzione semplice per tabelle temporanee che sono chiamati simile:

Se tutte le tabelle iniziano con lo stesso prefisso, ad esempio p1_table1 e p1_table2, quindi il seguente codice eliminare qualsiasi tavolo con che inizia con p1

proc datasets; delete p1: ; run;

Problemi correlati