2017-08-17 3 views
0

私は巨大な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を使用することができますか?

+0

SYMGETをお試しください。 – Reeza

+0

SYMGETコールは、引用符付きのdset名の中にある必要があり、解決されません。 –

答えて

1

答えは - このためにマクロを使用するのは間違いでした。私はそうのように、通常のデータセット変数を使用することができます。

%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 ; 
1

あなたはOUTPUTメソッド呼び出しでハードコードにデータセット名を必要としません。変数や式を使用することもできます。

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