Hash SAS中replace()方法的哈希内存使用情况

Hash SAS中replace()方法的哈希内存使用情况,hash,sas,Hash,Sas,当我使用replace()方法时,为什么我的散列会超过内存限制,而如果我使用相同的代码而没有replace方法,那么散列正好适合?看起来不管怎样,散列都会保持相同的大小。我正在unix上运行代码。在下面的代码中,如果注释掉ht.replace(),代码运行良好。如果我把它留在里面(不要注释掉),那么我会收到一条消息,说“当内存出现故障时,哈希对象添加了2490352项。”输入哈希的“series”数据集有13个变量和6912行。“data1”数据集有26970行和4列。有没有什么方法可以在不影响

当我使用replace()方法时,为什么我的散列会超过内存限制,而如果我使用相同的代码而没有replace方法,那么散列正好适合?看起来不管怎样,散列都会保持相同的大小。我正在unix上运行代码。在下面的代码中,如果注释掉ht.replace(),代码运行良好。如果我把它留在里面(不要注释掉),那么我会收到一条消息,说“当内存出现故障时,哈希对象添加了2490352项。”输入哈希的“series”数据集有13个变量和6912行。“data1”数据集有26970行和4列。有没有什么方法可以在不影响内存大小的情况下解决这个问题

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;
数据\u空\u;
如果为0,则设置序列;
如果_n_=1,则执行;
声明哈希ht(数据集:“系列”,有序:“a”,多数据:“是”);
rc=高温定义(“一”、“二”、“三”);
rc=ht.定义数据(全部:“是”);
宣布hiter hi(“ht”);
rc=ht.defineDone();
结束;
设置data1 end=eof;
rc=hi.first();
do while(rc=0);

如果low可能,问题是您的散列是多数据散列,即一个键可以对应多个数据项。对于多数据散列,您必须使用REPLACEDUP方法,不仅要明确地选择一个特定的键,还要在该键中选择一个特定的数据项

因此,在哈希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; 
rc=hi.first();
do while(rc=0);
rc=ht.find_next();
do while(rc=0);
如果低