2017-08-10 159 views
0

早安, 我試圖課程校在SAS使用PROC IML下一個簡單的功能,但我得到一個錯誤「沒有足夠的內存來存儲所有矩陣」。我想讀兩個矩陣一個呼叫「matriz_product」,另一個「matriz_segment」,這些表具有21X(大於)的尺寸1.000.000和值的字符。在閱讀本矩陣我想創建從每個其中列選擇了表中的一個矢量之後是在位置(即我讀另一矢量)中指定的一個。SAS PROC IML錯誤:沒有足夠的內存來存儲所有的矩陣

的代碼如下:

proc iml; 
use spain.Tabla_product; 
read all var {a_def_prdt1 b_def_prdt2 c_def_prdt3 d_def_prdt4 e_def_prdt5 f_def_prdt6 g_def_prdt7 h_def_prdt8 i_def_prdt9 j_def_prdt10 k_def_prdt11 l_def_prdt12 m_def_prdt13 n_def_prdt14 o_def_prdt15 p_def_prdt16 q_def_prdt17 r_def_prdt18 s_def_prdt19 t_def_prdt20} into matrizProduct; 
use spain.Tabla_segment; 
read all var {a_def_sgmt1 b_def_sgmt2 c_def_sgmt3 d_def_sgmt4 e_def_sgmt5 f_def_sgmt6 g_def_sgmt7 h_def_sgmt8 i_def_sgmt9 j_def_sgmt10 k_def_sgmt11 l_def_sgmt12 m_def_sgmt13 n_def_sgmt14 o_def_sgmt15 p_def_sgmt16 q_def_sgmt17 r_def_sgmt18 s_def_sgmt19 t_def_sgmt20} into matrizsegment; 
use spain.contratonodato; 
read all var {posi} into position; 
n=nrow(matrizsegment); 
DEF_PRDT=j(n,1,"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"); 
DEF_SGMT=j(n,1,"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"); 
do i =1 to n; 
DEF_PRDT[i,1]=matrizproduct[i,position[i]]; 
DEF_SGMT[i,1]=matrizsegment[i,position[i]]; 
end; 
create contratosnodato_modi var {"DEF_SGMT" "DEF_PRDT"}; 
append; 
run; 

非常感謝你。

回答

0

基地SAS讀取一行一行地等幾乎耗盡內存。 PROC IML讀取整個數據集到存儲器中,因此可以很容易地運行的內存對於較大數據集。出於這個原因,我只用PROC IML在絕對必要(例如在做矩陣乘法),當我做我會:

  1. 組塊的數據集成小塊,將適合到內存中,並做這些順序。

  2. 優化算法,以能夠限制範圍內運行 - 例如,利用一矩陣I需要反轉,以避免反相整個矩陣的結構。

幸運在這種情況下,你甚至不出現需要PROC IML在所有 - 你正在試圖做的可以在數據步做什麼。試試這個:

data contratosnodato_modi; 
    format DEF_PRDT $40. DEF_SGMT $40.; 
    set spain.Tabla_product; 
    set spain.Tabla_segment; 
    set spain.contratonodato; 
    array product {20} a_def_prdt1 b_def_prdt2 c_def_prdt3 d_def_prdt4 e_def_prdt5 f_def_prdt6 g_def_prdt7 h_def_prdt8 i_def_prdt9 j_def_prdt10 k_def_prdt11 l_def_prdt12 m_def_prdt13 n_def_prdt14 o_def_prdt15 p_def_prdt16 q_def_prdt17 r_def_prdt18 s_def_prdt19 t_def_prdt20; 
    array segment {20} a_def_sgmt1 b_def_sgmt2 c_def_sgmt3 d_def_sgmt4 e_def_sgmt5 f_def_sgmt6 g_def_sgmt7 h_def_sgmt8 i_def_sgmt9 j_def_sgmt10 k_def_sgmt11 l_def_sgmt12 m_def_sgmt13 n_def_sgmt14 o_def_sgmt15 p_def_sgmt16 q_def_sgmt17 r_def_sgmt18 s_def_sgmt19 t_def_sgmt20; 
    DEF_PRDT = product{posi}; 
    DEF_SGMT = segment{posi}; 
    keep DEF_PRDT DEF_SGMT; 
run; 

在這裏,我閱讀完所有的數據在一次存儲感興趣的列數組和僅訪問的位置數據集中指定的列。

相關問題