使用SAS中的replace()方法散列内存使用情况

时间:2014-03-06 00:09:17

标签: hash sas

当我使用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;

1 个答案:

答案 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;