2015-06-01 39 views
2

我想了解MPConnect以及如何將其用於並行處理。使用MP Connect進行SAS並行處理入門

作爲一個簡單的例子,我開始了一個打印「Hello World!」的會話。永遠和另一個打印「再見世界!」。我說「waitfor 任何」和「rget」,我期待「再見世界!」在日誌中,因爲「Hello World!」將永遠繼續而「再見世界!」已完成。不幸的是,這不起作用。

通常,從遠程提交的任務中檢索輸出時遇到很大困難。

option cpucount=4 sascmd="!sascmd" autosignon; 

rsubmit task1 wait=no; 

    data _null_; 
     do while(1); 
     put "Hello World!"; 
     end; 

    run; 

endrsubmit; 


rsubmit task2 wait=no; 

    data _null_; 
     put "Bye World!"; 
    run; 

endrsubmit; 


waitfor _any_; 
rget; 

signoff task1; 
signoff task2; 
+0

你實際上在日誌輸出中得到了什麼? – user667489

+0

它只是永遠持續下去。我認爲本迪是對的。當我試圖製作數據集而不是放入日誌時,我可以看到數據集是異步創建的。看來RGET需要等待。 – Matt

回答

0

的問題似乎是,當你運行syncronous過程,他們是相互完全斷開。即使你只是等待快速task2完成後再繼續:

rsubmit task2 wait=no; 
    data _null_; 
     put "Bye World!"; 
    run; 
endrsubmit; 

SAS需要task1完成以及爲最終rget

rsubmit task1 wait=no; 
    data _null_; 
     do while(1); 
     put "Hello World!"; 
     end; 
    run; 
endrsubmit; 

我認爲正在發生的事情是,SAS task2滿足waitfor _any_條件並能在task2之後進行處理。但是,rget需要每個(完成)進程的最終日誌文件,然後才能將它們合併到客戶端會話日誌窗口中。

看一看的SAS文檔here的細節部分:

編輯:

周圍多一點玩,你可以使用一個統一的LIBNAME測試在它們之間的連接(每個進程都有其獨特的工作LIBNAME所以它們不能相互衝突):

分配LIBNAME,並根據需要在客戶機上選擇:

libname testlib 'C:/test' ; 
option cpucount=4 sascmd="!sascmd" autosignon; 

定義兩個進程同時運行:

* Process 1 ; 
rsubmit task1 wait=no; 
libname testlib 'C:/test' ; 
data testlib.test1 ; 
    do i=1 to 1000 ; 
    do j=1 to 1000; 
     output ; 
    end ; 
    end ; 
run ; 
endrsubmit; 

* Process 2 ; 
rsubmit task2 wait=no; 
libname testlib 'C:/test' ; 
data testlib.test2 ; 
    do i=1 to 1000 ; 
    output ; 
    end ; 
run ; 
endrsubmit; 

然後,您可以有這樣下面的代碼將同時process1運行仍在運行,但它將能夠訪問的process2輸出數據集:

* Wait for either of the above processes and the process remaining code; 
waitfor _any_; 

proc sql noprint ; 
    select sum(i) 
    into :result 
    from testlib.test2 
;quit ; 

%put *** SUM OF TEST2 IS: &result *** ; 
+0

你是對的,我認爲rget需要等待一切。我認爲這有點愚蠢......一般來說,我不知道如何讓SAS只要計算出結果就可以連續輸出結果。例如,如果我有3個製表符,它們都必須在輸出之前完成。 – Matt

+1

是的,這絕對是奇怪的,但我假設它具有並行處理的野獸的性質。仍然看看這個鏈接,描述如何使用rsubmit task1 log =「task1.log」output =「task1.lst」'爲每個進程指定單獨的日誌/輸出文件:http://support.sas .COM/RND /可擴展性/技巧/ connect.html – Bendy

1

問題是,就像你說的那樣,TASK1被設置爲永遠運行。具體來說,這是聲明

signoff task1; 

這是造成您的特定問題。正如你說的提交過程等待不確定的過程結束,然後擱筆......

相反,如果你有

signoff task2; 
killtask task1; 

你會看到你所做的收集日誌信息TASK2與RGET(SIGNOFF聲明也會在沒有RGET的情況下收集)。來自TASK1的信息在這種情況下會丟失,但已經提到的選項(LOG =「task1.log」)可以分別恢復信息。

在這種情況下,RGET語句不會等待一切完成。它會收集在請求時已完成的任何任務,除非您明確要求RGET TASK1,在這種情況下,它將暫停。