2016-12-29 33 views
1

のうち、私はSAS DIS(データ統合スタジオ)で「リモートプロセスがメモリ不足です」取得しています:私のアプローチが間違っている可能性がありますので、 enter image description hereSASは、メモリエラー

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列)のデータセットでメモリ不足エラーが発生することはありますか?
  • 最終的に、これをどのようにしてメモリ不足エラーで解決しますか?

ありがとう!

+0

一時的な配列を使用し、データセットをメモリにロードしています。 20行で問題が発生している場合は、非常に低い制限が必要です。データ(PRXPARSE)を前処理してこのステップでデータを読み込むことができますか?文字列の長さを制限して、長さなどを200にしないようにしてください。 – Reeza

+0

あなたのパーティションには、清掃する名前のリスト、または適用するルールのリストがありましたか?ルールのリストが記憶を取るものだと私には思われます。 – Tom

+0

@Tomルールのリストはたった20行ですが、本当にたくさんのメモリが必要ですか?あなたが "パーティション"とは何を意味するのか分かりません。私は、名前のデータセットを元々〜500Kのサイズで1000または10000のサイズのパーティションに分割しました。どちらも機能しませんでした。これはあなたが意味することですか? – Rookatu

答えて

0

問題は、ジョブが生成していたログが大きすぎることが判明しました。可能な解決策は、ロギングを無効にするか、定期的にパージするか、または十分なスペースがある場所にログをリダイレクトすることです。