Hash 在与调用symput()相同的数据步骤中使用宏变量?

Hash 在与调用symput()相同的数据步骤中使用宏变量?,hash,macros,sas,Hash,Macros,Sas,我正在运行一个巨大的数据集,填充唯一值的散列。在庞大的数据步骤结束时,我将散列内容吐出到第二个数据集 庞大的数据集足以导致内存不足错误——具体来说: > ERROR: Hash object added nnnnnn items when memory failure occurred. > FATAL: Insufficient memory to execute DATA step program. Aborted > during the EXECUTION phase.

我正在运行一个巨大的数据集,填充唯一值的散列。在庞大的数据步骤结束时,我将散列内容吐出到第二个数据集

庞大的数据集足以导致内存不足错误——具体来说:

> ERROR: Hash object added nnnnnn items when memory failure occurred.
> FATAL: Insufficient memory to execute DATA step program. Aborted
> during the EXECUTION phase.
因此,我希望定期将散列内容写入数据集,然后刷新散列并继续。为了做到这一点,我需要为散列输出数据集提供唯一的名称。下面是我的代码的一个小版本,它说明了这个问题:

data huge ;
  do i = 1 to 50 ;
    recnum = ceil(i / 15) ;
    output ;
  end ;
run ;
* Write the hash out every 20 records. ;
%let chunk_size = 20 ;
data huge ;
  set huge end = alldone ;
  if _n_ = 1 then do ;
    declare hash myhash() ;
    myhash.definekey('i') ;
    myhash.definedata('i', 'y') ;
    myhash.definedone() ;
    call missing (y) ;
  end ;

  y = i * 3 ;

  myhash.ref() ;

  if mod(_n_, &chunk_size) = 0 then do ;
    call symput("chunk_num", put(_n_/&chunk_size, z2.0)) ;
    myhash.output("dataset: part&chunk_num") ;
  end ;

  if alldone then do ;
    myhash.output("dataset: part_final") ;
  end ;
run ;
调用symput()正在工作&创建了var(我可以symget()将其输出并放入dset变量frx中),但我似乎无法在hash输出语句中使用它。我得到的错误是:

WARNING: Apparent symbolic reference CHUNK_NUM not resolved.
如何使用我的&chunk\u num macro var命名我的临时哈希输出数据集?

答案是——为此使用macro是一个错误。我可以使用普通的数据集变量,如下所示:

%let chunk_size = 20 ;
data huge ;
  set huge end = alldone ;
  if _n_ = 1 then do ;
    declare hash myhash() ;
    myhash.definekey('i') ;
    myhash.definedata('i', 'y') ;
    myhash.definedone() ;
    call missing (y) ;
  end ;

  y = i * 3 ;

  myhash.ref() ;

  if mod(_n_, &chunk_size) = 0 then do ;
    hash_dset_name = cats("chunk_num", put(_n_/&chunk_size, z2.0)) ;
    myhash.output(dataset: hash_dset_name) ;
    myhash.clear() ;
  end ;

  if alldone then do ;
    myhash.output(dataset: "part_final") ;
  end ;
  drop hash_dset_name ;
run ;
答案是——使用宏来实现这一点是错误的。我可以使用普通的数据集变量,如下所示:

%let chunk_size = 20 ;
data huge ;
  set huge end = alldone ;
  if _n_ = 1 then do ;
    declare hash myhash() ;
    myhash.definekey('i') ;
    myhash.definedata('i', 'y') ;
    myhash.definedone() ;
    call missing (y) ;
  end ;

  y = i * 3 ;

  myhash.ref() ;

  if mod(_n_, &chunk_size) = 0 then do ;
    hash_dset_name = cats("chunk_num", put(_n_/&chunk_size, z2.0)) ;
    myhash.output(dataset: hash_dset_name) ;
    myhash.clear() ;
  end ;

  if alldone then do ;
    myhash.output(dataset: "part_final") ;
  end ;
  drop hash_dset_name ;
run ;

您不需要在输出方法调用中硬编码数据集名称。可以使用变量甚至表达式

if mod(_n_, &chunk_size) = 0 then do ;
  myhash.output(dataset: cats('part',put(_n_/&chunk_size,z2.))) ;
end ;

您不需要在输出方法调用中硬编码数据集名称。可以使用变量甚至表达式

if mod(_n_, &chunk_size) = 0 then do ;
  myhash.output(dataset: cats('part',put(_n_/&chunk_size,z2.))) ;
end ;

尝试使用SYMGET?SYMGET调用需要位于引用的数据集名称内,且无法解析。尝试使用SYMGET?SYMGET调用需要位于引用的数据集名称内,且无法解析。