【忘備録】SASで巨大データセットから先頭100Obsを抽出

Share Button

10億件とかのデータセットにデータステップで処理かけるのに、すげー時間かかった挙句に処理がうまくいってなかったら嫌じゃないですか。未だにそんなことやってるんですかって思われるかもしれませんけど、試しに先頭の100オブザベーションだけ抽出して一回処理かけたりしてるんですよ私は。

で、それを行うための先頭100Obsの切り出しに

data test;
   set raw;
   if _n_ < 101;
run;

とかいうクソコードを走らせていたんですね。
これ_N_が101超えた瞬間に読み出し止めてくれればいいのに律儀に10億件のデータセットの最後まで「このObsは_n_<101か?」みたいな確認をしてくれてるみたいで、普通に莫大な時間がかかるんですよね。一晩かけたりしてて、正直なんとかならねえのかなと思ってたんですよ。

でも今日何気なく、全く関係ないif _n_=1 then setのことを調べていて、データステップ100万回 SAS新手一生: 1obsのデータセットの値を他のデータセットに対して引き延ばして結合する辺りを読んでた時に、2つのデータセットをSET;SET;するときにObs数の小さい方にデータセットが切り落とされる話の中で以下の記述があったわけです。

SET;SET;はいずれかのデータセットのファイル終端を見つけた時点でオブザベーションの作成を打ち切る


ってことは、これ使えば100億件のObsでも100件の時点で読み込みを止められるじゃないですかー!やったー!ということです。

data dummy;
   do _i = 1 to 100;
      output;
   end;
run;
data test;
   drop _:;
   set dummy;
   set raw;
run;

これでrawのObsを100件まで読み込んだ時点でデータセットの読み出しが終わるわけじゃないですか。んで実際やったら本当に1秒ぐらいで終わりました。twitterのデータ読み出しとか実装してたくせにこんなとこで詰まってるんですかって感じですが。

っていうか色々考えてて思ったんだけどもっとシンプルな方法あるんじゃねえかこれ。でもまあとりあえず今はいいや。


Share Button

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.