当我使用replace()方法时,为什么我的哈希值超出了内存限制,如果我使用相同的代码而没有使用替换方法,则哈希适合使用?似乎哈希将保持相同的大小。我在unix上运行代码。在下面的代码中,如果我注释掉ht.replace(),代码运行正常。如果我把它留下(没有注释掉),那么我会收到一条消息,说“当发生内存故障时,哈希对象添加了2490352个项目”。馈入散列的“系列”数据集有13个变量和6912行。 “data1”数据集有26970行和4列。有没有办法解决这个问题,而不会弄乱memsize?
data _null_;
if 0 then set series;
if _n_ = 1 then do;
declare hash ht(dataset:"series", ordered:"a", multidata:"yes");
rc = ht.defineKey("one", "two", "three");
rc = ht.defineData(all:"yes");
declare hiter hi("ht");
rc = ht.defineDone();
end;
set data1 end=eof;
rc = hi.first();
do while (rc = 0);
if low <= code1 <= high then do;
sum = sum + value1;
ht.replace();
end;
rc = hi.next();
end;
if eof then ht.output(dataset:"sum1");
run;
答案 0 :(得分:2)
问题可能是你的散列是多数据一,即一个键可以对应许多数据项。对于多数据哈希,您必须使用REPLACEDUP方法,不仅明确地选择特定键,还要明确选择此键中的特定数据项。
所以你对hash hash ht的迭代应该是这样的:
rc = hi.first();
do while (rc = 0);
rc=ht.find_next();
do while(rc=0);
if low <= code1 <= high then do;
sum = sum + value1;
ht.replacedup();
end;
rc=ht.find_next();
end;
rc = hi.next();
end;