SAS PROC IML错误:没有足够的内存来存储所有的矩阵
问题描述:
早安, 我试图课程校在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;
非常感谢你。
答
基地SAS读取一行一行地等几乎耗尽内存。 PROC IML读取整个数据集到存储器中,因此可以很容易地运行的内存对于较大数据集。出于这个原因,我只用PROC IML在绝对必要(例如在做矩阵乘法),当我做我会:
组块的数据集成小块,将适合到内存中,并做这些顺序。
优化算法,以能够限制范围内运行 - 例如,利用一矩阵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;
在这里,我阅读完所有的数据在一次存储感兴趣的列数组和仅访问的位置数据集中指定的列。