最近はハッシュオブジェクトを利用する事例をたまーに見かけます。
私は普段はハッシュオブジェクトは利用しないので、遭遇すると若干困るのですが、食わず嫌いは良くないと思ったので今回は
ハッシュオブジェクトの有用性を考察しました。
ハッシュオブジェクト(ハッシュテーブル)とは
ハッシュオブジェクトはデータ構造の一つで、メモリ上に展開されます。配列の一種であり、キーとキーに関連付けられたデータを格納します。
キーとデータの関連づけはハッシュ関数を通じて実装されます。
ハッシュオブジェクトを利用するメリット
適切に実装されたハッシュオブジェクトであれば、検索コストはハッシュオブジェクトに保存されたデータ数に依存しません。
つまりデータ数が1000のハッシュオブジェクトからデータを検索する場合と、データ数1000万のハッシュオブジェクトからデータを検索する場合では、検索に要する時間はさほど変わらないわけです。
検索に要する時間は一定であり、データ数が増えても大きくはなりません。これが最大のメリットです。
ハッシュの利用方法
上記の仕組みから、ハッシュオブジェクトはルックアップテーブルとしてデータの検索に適しています。
キーを用いてソートを実行することもできますし、データセットのマージにも使用できます。
以下の報告では複数の異なる方法でデータのマージを実行したところ、ハッシュオブジェクトを利用した方法が最も早かったことが示されています。
RDBMSに保存されたデータはSASでソートやインデックス化ができないため、データステップではこのようなデータのマージを実行することができない場合がありますが、ハッシュオブジェクトはSAS以外のデータもマージすることができるようです。
データの抽出、ソート、マージに30分かかっていた処理がハッシュオブジェクトで同じ操作を実施したところ3分で完了できたとの報告もあります。
10分の1は驚異的ですね。
臨床試験データでは微妙?
データのソート、マージ、検索などの処理に関しては、ハッシュオブジェクトはデータステップよりもずっと高速です。そのためれレコード数が多い解析であれば真価を発揮するでしょう。
ただ、臨床試験データはそもそもデータ数はそんなに多くはないため、処理速度のメリットは享受することは難しいのでないでしょうか?
またハッシュオブジェクトはメモリに展開するため、実行するマシンのメモリ容量に依存します。大容量のデータをすべてメモリに展開できるマシンでないとメリットは薄そうです。サーバーでないときついかも。
少なくとも数万レコード程のデータでないと体感できるほどのメリットは感じられなさそうです。
まとめ
ハッシュオブジェクトはデータステップよりもソートやマージなどの処理速度が速いため、大量のレコードを持つデータセットであれば処理時間短縮の効果がありそうです。
ただし、もともとデータ数がそこまで多くはない臨床試験データではあえてハッシュオブジェクトを利用するメリットはなさそうです。
個人的な印象では、データベース研究のようなRDBMSを利用している調査で、SASとデータベースを接続する場合なら利用価値はあるかなと感じました。
<2022/02/09 追記>
最近ハッシュオブジェクトをコーディングルールとして定めているプロジェクトに参加したのですが、採用している理由はmergeステートメントの変数上書きのクソ仕様を回避したいのと、単純に処理速度が速いからでした。確かにレコード数が数十万近くあったので、実行時間の観点からハッシュオブジェクトを使うメリットは大きいと感じました。実行速度のメリットはおまけという意見もありましたけど、案件によっては十分メリットだと思います。
でも単にマージするってだけならハッシュオブジェクトではなくてSQLでいいんじゃないかな。SQLのほうができることが多いしなによりSAS以外の環境でも通用する言語なので、勉強するメリットは高いと思います。ハッシュオブジェクトの構文はSAS限定ですからね。