ソートが恐ろしく遅い

Last-modified: 2009-05-08 (金) 16:32:10

大き目のデータセットをソートする場合,ソート処理にかかる時間や,必要なリソース(メモリ,ハードディスク)が結構かかることがあります.
本当にそれだけかかってしまうべきものもありますが,いくつかの対処方法をメモしておきます.

  • tagsortオプションを使ってみる.
    proc sort data=bigdata tagsort;
      by key1 key2;
    run;
    変数の多いデータは,キー以外のデータも読みこむため,時間とリソースがとられます.
    tagsortオプションを指定すると,先にキー変数だけ読み込み,キーをソートしてから,再度元データのキー以外のデータを読んで,ソート済みデータセットを作ります.2度読みしますが,キー以外の項目が多いデータでは,かえって速く,リソース不足によるエラーも発生しにくくなります.
  • アサインするソート用メモリサイズ(sortsize)を大きくする.(デフォルト値でなく,明示する)
    proc sort data=bigdata sortsize=800M;by key1;run;
    800Mは,800MBのことで,800000Kまたは800000000とも書けます.sortsizeのデフォルト値は,次で調べられます.
    proc options option=sortsize;run;
    => SORTSIZE=67108864  ソートのサイズパラメータを指定します
  • コンプレスされたデータ
    大きいファイルでないつもりが,コンプレスされているために気がつかず,実は結構大きいデータだったということもあります.実際に中身が詰まっているなら仕方ありませんが,非常に大きい変数長をもった変数でも.ほとんどが使われていないなら,変数を再定義して,長さを必要な分だけに短くしましょう.
    圧縮率の高いデータセットは,無駄な領域が多い可能性があり,ソート時の効率に大きく影響します.