のうち、私はSAS DIS(データ統合スタジオ)で「リモートプロセスがメモリ不足です」取得しています:私のアプローチが間違っている可能性がありますので、 SASは、メモリエラー
I'LL私が取り組んでいる問題と私が決めた解決策を説明してください:
私はクリーニングが必要な顧客名の大きなリストを持っています。これを実現するために、正規表現パターンとそれに対応する置換文字を含む.csvファイルを使用します。 (私はこの方法を使用します。新しいパターンをファイルに追加して、サーバーにアップロードする方が、新しいルールを採用してジョブを再デプロイするのではなく、読み込んだジョブを簡単にアップロードできるからです)。
ファイル内のルールを使用するためにデータステップを取得するために、パターンとその置換えをデータステップの最初の繰り返しで配列に追加し、それを自分の名前に適用します。何かのように:
DATA &_OUPUT;
ARRAY rule_nums{1:&NOBS} _temporary_;
IF(_n_ = 1) THEN
DO i=1 to &NOBS;
SET WORK.CLEANING_RULES;
rule_nums{i} = PRXPARSE(CATS('s/',rule_string_match,'/',rule_string_replace,'/i'));
END;
SET WORK.CUST_NAMES;
customer_name_clean = customer_name;
DO i=1 to &NOBS;
customer_name_clean = PRXCHANGE(a_rule_nums{i},1,customer_name_clean);
END;
RUN;
約10K行以下でこれを実行すると、常に完了し、非常に迅速に終了します。 〜15Kの行を試してみると、超長時間にわたってチョークし、最終的には「メモリ不足」エラーが発生します。
これを試してみるために、私は最初に自分のデータセットの行に番号を付けてループを構築しました。そして、一度に10000個の名前のバッチで前のロジックを適用します。非常に長い時間が経過した後、私はメモリエラーから同じエラーを出しましたが、ターゲットテーブル(Teradata)をチェックすると、最後の反復以外のすべてのデータが実行されロードされていました。ループのサイズを10000から1000に切り替えると、まったく同じ動作が見られました。
私は約500K行しか使用していませんでしたが、すぐに何百万もの処理をしなければならず、これがどのように機能するのか心配です。参考までに、私が適用しているクリーニングルールのセットは現在20行ですが、おそらく数百になるでしょう。
- 私のデータストアで正規表現を直接ハードコーディングするのではなく、ルールを持つファイルを使用する方が効率的ではありませんか?
- これをループすることなく達成する方法はありますか?
- 私のデータセットはすべてのループ反復で上書きされるため、1000行(および3列)のデータセットでメモリ不足エラーが発生することはありますか?
- 最終的に、これをどのようにしてメモリ不足エラーで解決しますか?
ありがとう!
一時的な配列を使用し、データセットをメモリにロードしています。 20行で問題が発生している場合は、非常に低い制限が必要です。データ(PRXPARSE)を前処理してこのステップでデータを読み込むことができますか?文字列の長さを制限して、長さなどを200にしないようにしてください。 – Reeza
あなたのパーティションには、清掃する名前のリスト、または適用するルールのリストがありましたか?ルールのリストが記憶を取るものだと私には思われます。 – Tom
@Tomルールのリストはたった20行ですが、本当にたくさんのメモリが必要ですか?あなたが "パーティション"とは何を意味するのか分かりません。私は、名前のデータセットを元々〜500Kのサイズで1000または10000のサイズのパーティションに分割しました。どちらも機能しませんでした。これはあなたが意味することですか? – Rookatu