3

SAS プログラムを実行すると、「A lock is not available」というエラーが常に表示されます。通常、1 つのプログラムで同じデータセットに対して複数回操作を実行すると発生します。このエラーを調査した結果、これは 2 つのプログラムが同じデータセットにアクセスしようとしていることを意味していると理解しています。つまり、他のユーザーまたは自分自身が既に使用しているドキュメントを開こうとするのと似ています。このエラーが発生するコードの例を次に示します。

data TSTONE.map;
    infile <PATH> delimiter = ',' truncover firstobs=2 dsd TERMSTR=cr LRECL=32760;

    format assessment_edition $45.;
    format ...

    input
    assessment_edition :$45.
    ...
    ;
run;

data tstone.map;
    set tstone.map;
    drop DistrictName ...;
run;

インポートまたはドロップするフィールドの長いリストがあるいくつかの場所に「...」と入力しました。そのため、最初に CSV ファイルをインポートし、次にデータ ステップを実行してファイルを上書きし、不要なフィールドを削除します。このようなプログラムを実行すると、ロック エラーが発生しないことがあります。他のユーザーはこれらのデータセットにアクセスしておらず、私のマシンに対してローカルです。また、2 つのデータ ステップを連続して強調表示して実行すると、問題は発生しません。

4

4 に答える 4

3

次のように %do ループで proc append を実行すると、同じ問題が発生します。

%do i=1996 %to 2013;
proc append base=inscat.pc_all data = pc&i. force;
run; quit;
%end;

これは私のローカル マシン上にあったため、データセットにアクセスしようとする人は他にいませんでした。何が起こっていたかというと、ループの実行速度が速すぎて、ループの次の部分の書き込みを開始する前にベース ファイルが閉じられなかったということです。多くの複雑なソリューションを試してみた結果、ロックの失敗を宣言する前に SAS が待機する時間を延長できることがわかりました。ライブラリを作成するときにこれを行います。

libname inscat 'C:\Users\...\insurercat\data' filelockwait=5;

SASがロックエラーであると判断する前に、待機時間を5秒に延長するだけです(デフォルトの0からだと思います)。この単純なオプションにより、私が抱えていたすべてのロックの問題が修正されました。

于 2015-08-27T16:43:45.337 に答える
3

まず、ロック エラーは単にタイミングの問題である可能性があります。サーバーは、以前のインポートからファイルのロックを解除していない可能性があります。データセット名を再利用しないという回避策があります。一時的な作業が必要な場合は、ファイルを一時的な ( work.) データセットにインポートしてから、そのデータセットをデータセットに設定しtstone.ます。サーバーでは (特に NAS を使用して) ロック エラーが発生する可能性が高くなります。ローカル ディスクでは、通常、ファイル ロックの遅延は非常に短いため発生しません (不可能ではありません)。

第 2 に、DROP (KEEP や RENAME など) は、OUT= や SET などの存在するほぼすべてのデータ セット オプションで実行できます。たとえば、次のことができます

proc import file=<whatever> out=tstone.map(drop=... list of drops...);
run;

いくつかの変数を削除するためだけに、SAS にデータセット全体の再処理を強制する理由はありません。

于 2013-07-25T15:53:17.447 に答える