The Nameless City

何故か製薬やSAS関連のブログ、の予定。

Programming Data Vectorとはなんぞやという話で。

Programming Data Vector自体は、メモリ上に1レコード分(+アルファ)確保される、DATAステップを処理するために一時的にメモリ上に確保される論理領域、です。
SASデータセットは、可変長文字列とかがないので、1レコードの論理バイト長とかはDATAステップのコンパイル時に決まってきます。なので、Programming Data Vectorは、とても身も蓋も書い、「ハコ」として確保されてます。


例えば、NAME/長さ20バイト、SEX/長さ3バイト、というような形で出力が定義される場合、
Programming Data Vectorはサイズとして23バイト、で自動変数_N_、_ERROR_がそれぞれ8バイトずつ追加的に後ろにくっつけられるイメージです。
論理サイズですが。実際の物理サイズは「メモリ確保をまとめてしないと効率が悪い」とかで多分ある程度大きめに取られているのでそれよりは大きいイメージです。
この辺りはロジックも詳細理解してないんで申し訳ないがイメージだけ。

PDV。

ここの一行目のが説明用のアドレスです。ちゃんと真面目にやる場合には2進数で出すべきかもですが、面倒なんでこうします。

コンパイルの際に、変数名とアドレスの変換表みたいなのは作られてます。これを用いて、プログラムが機械語に変換されます。

同様に、カラムのメタデータも表みたいなのはあります。
が、これらの表もあくまでもイメージ、メモリ上には一次元で並べられているものを見やすいように二次元の表にしていると考えて下さい。


コンパイル時にアドレスに変換する事で、リアルタイムで1レコードずつ読み込んでいる時に変数名を参照しながらデータを取り出して比較したりするより高速に動作するようになります。また、このPDVは基本的にハコのサイズの確保はコンパイル時に計算され最初の最初に動きます。



余談。
現代のプログラミング言語では、C言語でいうところのポインタがもう少しマシになって、「参照」という呼ばれ方をして、あまりこういうメモリの事を考えずに済むようになってます(パフォーマンス考える時には裏側の動作理解必要だけど)。
なお、多くの言語でRDBをデータとして取り込む時に、「全件ロードしてメモリ上の配列にぶっこむ」方法と「1レコードずつ取り込んで処理して次のレコードに移動する」方法の二パターン大きく分けてあり、SASは後者しかない、と言えばない(RAMディスク上に取り込む事は除く)です。