早上好, 我正在尝试使用proc iml编写SAS中的下一个简单函数,但是我获得了下一个错误“没有足够的内存来存储所有矩阵”。我试图读取两个矩阵,一个叫“matriz_product”,另一个叫“matriz_segment”,这些表的维度是21x(超过)1.000.000,值是字符。在读完这个矩阵后,我想从每个表中创建一个向量,其中所选择的列是在位置指定的那个(我读过的另一个向量)。
代码如下:
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 :(得分:0)
基本SAS逐行读取,因此很少耗尽内存。 Proc IML将整个数据集读入内存,因此对于较大的数据集而言很容易耗尽内存。出于这个原因,我只在绝对必要时使用proc IML(例如进行矩阵乘法),当我这样做时,我会:
将块数据集分成适合内存的小块,并按顺序执行。
优化算法以便能够在约束条件下运行 - 例如,利用我需要反转的矩阵结构来避免反转整个矩阵。
幸运的是,在这种情况下,您甚至根本不需要proc IML - 您正在尝试做的事情可以在数据步骤中完成。试试这个:
var dictionary = jdictionaryFromHashMap.ToDictionary(t => t.Key, t => t.Value);
这里我一次读取所有数据,将感兴趣的列存储为数组,只访问位置数据集中指定的列。