2016-12-29 47 views
1

我得到一個「遠程進程內存不足」在SAS DIS(數據集成工作室): enter image description hereSAS內存不足的錯誤

因爲它是可能的,我的做法是錯的,我會說明我工作的問題和解決方案,我就決定:

我有需要清洗客戶名稱的大名單。爲了實現這一點,我使用了一個包含正則表達式模式及其相應替換的.csv文件; (我使用這種方法,因爲向文件添加新模式並將其上傳到服務器以便部署作業讀取而不是破壞新規則並重新部署作業會更容易。

爲了得到我的數據步驟使用的文件中的規則我的模式及其替代品添加到我的數據步的第一次迭代的數組,然後將它們應用到我的名字。像這樣:

DATA &_OUPUT; 

    ARRAY rule_nums{1:&NOBS} _temporary_; 
    IF(_n_ = 1) THEN 
     DO i=1 to &NOBS; 
      SET WORK.CLEANING_RULES; 
      rule_nums{i} = PRXPARSE(CATS('s/',rule_string_match,'/',rule_string_replace,'/i')); 
     END; 
    SET WORK.CUST_NAMES; 
    customer_name_clean = customer_name; 
    DO i=1 to &NOBS; 
     customer_name_clean = PRXCHANGE(a_rule_nums{i},1,customer_name_clean); 
    END; 
RUN; 

當我運行這約10K行或更少時,它總是完成,並完成非常快。如果我嘗試使用〜15K行,它會窒息超長時間,最終會拋出「內存不足」錯誤。

要嘗試解決這個問題我建立了一個循環(使用SAS DIS循環變換),其中我第一個數字我的數據集的行,再一次將前面的邏輯中的10000名批次。在很長一段時間後,我得到了同樣的內存不足錯誤,但是當我檢查了我的目標表(Teradata)時,我注意到它運行並加載了除最後一次迭代以外的所有數據。當我將循環大小從10000切換到1000時,我看到了完全相同的行爲。

出於測試目的,我一直在與大約只有500K〜行,但很快就會有處理數以百萬計,並很擔心這是怎麼回事工作。作爲參考,我正在使用的這套清潔規則目前有20行,但可能會增長到幾百個。

  • 使用帶規則的文件而不是直接在我的datastep中直接對正則表達式進行硬編碼會顯着降低效率嗎?
  • 有沒有辦法實現這一點,而不必循環?
  • 因爲我的數據集被覆蓋在每個循環迭代,哪有爲1000行長(等3列)數據集的內存不足的錯誤?
  • 最終,我該如何解決這種內存不足錯誤?

謝謝!

+0

您正在使用臨時數組並將數據集加載到內存中。如果20行導致問題,則必須具有非常低的限制。你可以預處理數據(PRXPARSE),只在這一步加載數據,並確保限制字符串的長度,因此它不會以200的長度存儲它。 – Reeza

+0

您的分區是否包含要清除的名稱列表或要應用的規則列表?在我看來,規則清單就是要記住的內容。 – Tom

+0

@Tom規則列表只有20行,是否真的需要大量內存?不確定你的意思是「分區」;我確實將要清理的名稱數據集(最初大約500K)分解成1000或10000的分區。兩者都不起作用。你是這個意思嗎? – Rookatu

回答

0

問題竟然是該作業已生成日誌太大。可能的解決方案是禁用日誌記錄或將日誌重定向到可定期清除和/或具有足夠空間的位置。