私は巨大なdsetを実行しており、一意の値のハッシュを設定しています。巨大なdatastepの終わりに、私はハッシュの内容を第2のデータセットに吐き出しました。call symput()と同じdatastepでマクロvarを使用しますか?
巨大なデータセットは、メモリ不足エラーが引き起こすほど巨大である - 特に:
> ERROR: Hash object added nnnnnn items when memory failure occurred.
> FATAL: Insufficient memory to execute DATA step program. Aborted
> during the EXECUTION phase.
だから私は定期的に行くのハッシュ&キープをフラッシュし、その後DSET &に出ハッシュ内容を書きたいです。これを行うには、ハッシュ出力データセットの固有の名前を考え出す必要があります。ここでは、問題を示して私のコードの小さなバージョンがあります:)(
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可能)アウト&のFRx、DSET変数にそれを置きます。)しかし、私はそのハッシュ出力ステートメントでそれを使用することはできません。私が手にエラーがある:
WARNING: Apparent symbolic reference CHUNK_NUM not resolved.
どのように私は私の暫定ハッシュ出力データセットに名前を付けるために私& chunk_numマクロVARを使用することができますか?
SYMGETをお試しください。 – Reeza
SYMGETコールは、引用符付きのdset名の中にある必要があり、解決されません。 –