2010-08-23 55 views
3

我有36個完全獨立的查詢,我需要在常規基礎上運行,如果他們每次可以運行3個查詢,數據庫會取消我們的查詢,如果我們嘗試並執行超過3次而不是每個人都在等待之前的完成。在SAS中同時運行多個查詢

我願做這樣的事情

/* Some prep code here*/ 

/* Launch batch 1 containing queries 1-12*/ 
/* Immediately launch batch 2 (13-24) without waiting for 1-12 to finish*/ 
/* Immediately launch batch 3 (25-36)*/ 

/* Wait until all 3 batches are done and run some conclusion code*/ 

或者,如果可能的話,只要給它的36個查詢一起,並將它同時運行多個並確保沒有超過3個運行在任何時間和任何時間完成後,只需從堆棧中添加下一個。

這可能使用SAS嗎?

謝謝

回答

3

我假設你有一個SAS服務器,並從本地機器啓動查詢。 (如果你不在本地工作,它不是一個問題,你可以對本地機器上的spawner做rsubmit) 即使使用SAS/Base,也可以通過在一個代碼中同時啓動3個查詢三個連接。 我假設在這裏你不想共享工作庫,是完全獨立的查詢

option autosignon=yes; 
option sascmd="!sascmd"; 

* some random data; 
data prova1; 
do i=1 to 20000000; 
    x=rand('UNIFORM'); 
    output; 
end; 
run; 

data prova2; 
do i=1 to 20000000; 
    y=rand('UNIFORM'); 
    output; 
end; 
run; 
*open connection to the server ; 

options comamid=tcp; 
filename rlink "D:\SAS\SASFoundation\9.2\connect\saslink\tcpwin.scr"; 
%LET host1=nbsimbol59; 
%LET host2=nbsimbol59; 

signon remote=host1 script=rlink; 
signon remote=host2 script=rlink; 

rsubmit process=host1 wait=no inheritlib=(work=cwork);; 

    proc sort data=cwork.prova1 out=cwork.r1; 
    by x; 
    run; 

    proc sort data=cwork.r1 out=cwork.r1a; 
    by i; 
    run; 


endrsubmit; 


rsubmit process=host2 wait=no inheritlib=(work=cwork);; 

    proc sort data=cwork.prova2 out=cwork.r2; 
    by y; 
    run; 

    proc sort data=cwork.r2 out=cwork.r2a; 
    by i; 
    run; 

endrsubmit; 

/* Wait for both tasks to complete. */ 
waitfor _ALL_ host1 host2; 

data r9; 
    merge r1a (in=a) r2a (in=b); 
    by i; 
    if a and b; 
    run; 


signoff host1; 
signoff host2; 

與此示例代碼唯一的問題是,它會等待兩個任務結束和ATM它並不浮現在腦海中的方式來讓它在一個結束後立即啓動另一個查詢,但我相信可能有一些解決方法。

現在,通過此代碼,您可以輕鬆地一次啓動3個查詢,然後再結束3個查詢,等等。 對於您的其他請求,我會考慮它:)

+0

如果您想在本地嘗試,請記住spawner:P – 2010-08-24 06:04:34

+0

太棒了!我不知道等待,inheritlib或waitfor ......這些都很棒。雖然我沒有能夠在本地工作。我沒有這臺機器的管理員權限,我不確定是否該spawner正在運行或如何檢查,或者如果是的話,我會放哪個主機。 – Dan 2010-08-24 18:24:12

+0

有沒有辦法讓我聲明一個可以在所有3個rsubmit語句中工作的宏? – Dan 2010-08-24 18:34:54

0

SAS網格計算?​​

+0

謝謝,但我不想使用多臺電腦。 – Dan 2010-08-24 18:14:59

2

在某些平臺(Windows和UNIX肯定),如果配置允許您的SAS會話與操作系統進行交互,那麼SYSTASK聲明爲您提供執行,列出或終止異步任務。與WAITFOR聲明相結合,你可以做這樣的事情:在SYSTASKWAITFOR聲明

systask command "sas prog1.sas" taskname=sas1; 
systask command "sas prog2.sas" taskname=sas2; 
systask command "sas prog3.sas" taskname=sas3; 
waitfor _all_ sas1 sas2 sas3; /* suspend current session until the three jobs are finished */ 

查看文件(用於Windows平臺)。