Hallo,
prinzipiell ist die von jh_ti_bw vorgeschlagene Lösung mit proc sql auf jeden Fall zu bevorzugen und performanter.
Das Problem bei deiner Verwendung des Hash Objects ist, dass du es bei jeder neuen Beobachtung aus dem Input-Dataset neu erstellst (und nicht nur einmalig bei der ersten Beobachtung). Im folgenden Code ist das korrigiert, jetzt sollte das Zählen funktionieren. Ich weiß nicht, ob das auch das Speicherproblem behebt, bei mir läuft es auch mit 100000 problemlos durch.
data work.test (keep=key1 count_m count_f count_key2 count_key2_2 );
set work.randomdata;
by key1;
if _N_ = 1 then
do;
declare hash h_obj;
h_obj = _new_ hash(hashexp: 10);
rc = h_obj.definekey("key2");
rc = h_obj.definedata("datafield");
rc = h_obj.definedone();
declare hiter h_iter("h_obj");
end;
retain
count_m
count_f
count_key2
count_key2_2;
rc = h_obj.replace();
if first.key1 then
do;
count_m = 0;
count_f = 0;
count_key2 = 0;
count_key2_2 = 0;
end;
if last.key1 then
do;
count_key2 = h_obj.num_items;
rc = h_iter.first();
do while (rc = 0);
if datafield = 'M' then
count_m + 1;
else if datafield = 'F' then
count_f + 1;
count_key2_2 + 1;
rc = h_iter.next();
end;
rc = h_obj.clear();
output;
end;
run;
Falls das Speicherproblem weiter besteht, kannst du mit
options fullstimer;
genauere Angaben über den Speicherverbrauch ausgeben um das Problem einzugrenzen.
Viele Grüße
Christoph
... View more