5

SASハッシュテーブルのバケットの定義について少し説明したいと思います。問題は、まさにhashexpパラメーターに関するものです。

SAS DOCによると、hashexpは次のとおりです。

ハッシュオブジェクトの内部テーブルサイズ。ハッシュテーブルのサイズは2nです。

HASHEXPの値は、ハッシュテーブルサイズを作成するための2の累乗指数として使用されます。たとえば、HASHEXPの値4は、ハッシュテーブルサイズ24または16に相当します。HASHEXPの最大値は20です。

ハッシュテーブルのサイズは、保存できるアイテムの数と同じではありません。ハッシュテーブルを「バケット」の配列として想像してみてください。ハッシュテーブルのサイズが16の場合、16個の「バケット」があります。各バケットは、無限の数のアイテムを保持できます。ハッシュテーブルの効率は、アイテムをバケットにマップしたり、バケットからアイテムを取得したりするハッシュ関数の機能にあります。

ハッシュオブジェクトルックアップルーチンの効率を最大化するには、ハッシュオブジェクト内のデータ量に関連するハッシュテーブルサイズを設定する必要があります。最良の結果が得られるまで、さまざまなHASHEXP値を試してください。たとえば、ハッシュオブジェクトに100万個のアイテムが含まれている場合、16のハッシュテーブルサイズ(HASHEXP = 4)は機能しますが、あまり効率的ではありません。ハッシュテーブルのサイズが512または1024(HASHEXP = 9または10)の場合、最高のパフォーマンスが得られます。

問題は、ハッシュオブジェクトのデータ量ではないのに、ハッシュテーブルのサイズは正確には何であるかということです。

必要なだけのメモリを割り当てたいと理解する必要がありますが、それ以上ではありません。物事を速く動かすのは2の力です。ただし、使用される可能性のあるデータの量を制限するものではなく、使用されるデータの量を示すだけですよね?

4

2 に答える 2

6

Paul Dorfman(ハッシュのマスター)は、このホワイトペーパーの10ページでかなり詳細に説明しています。

http://www2.sas.com/proceedings/forum2008/037-2008.pdf

私が理解しているように、ハッシュテーブルはデータをバイナリツリーに格納します。hashexpによって作成された各バケットは、データの格納に使用されるバイナリツリーの数を表します。hashexpが0の場合は単一のツリーを使用し、hashexpが8の場合は256のツリーを使用します。ハッシュオブジェクトに対してルックアップが実行されると、内部アルゴリズムが(ハッシュ値に基づいて)キーが存在するツリーを決定します。次に、そのツリーで値を確認します。(たとえば)256本のツリーのどれを調べるかを自動的に知ることにより、単一の二分木と比較した場合、8回の比較(2 ^ 8)を節約できます。

全体はそれよりもはるかに複雑に見えますが、それがなぜそれがより速くうまくいくのかについての私の解釈です。

于 2012-07-06T14:01:08.477 に答える
3

Rob Penridgeが指摘したように、PaulDorfmanは確かにSASハッシュオブジェクトの第一人者です。Robの回答で述べたように、Hashexpはハッシュテーブルのサイズとは関係ありません。

ハッシュテーブルにロードされる100obsと10個の数値変数を持つテーブルがある場合、ハッシュテーブルのサイズは単純に100obs * 10vars * 8bytesです(すべての数値変数が8byteフィールドとして格納されていると仮定)7.8KBは10を与えるか取る%。

レコードがメモリ内のハッシュテーブルに追加されるときにSASがRAMスペースを動的に割り当てることを忘れないでください。したがって、事前にサイズを指定する必要はありません。[私はハッシュテーブルを定期的に使用していますが、どこにあるかは考えられません。事前にサイズを指定することができます]。

一般的なヒント:ハッシュテーブルのサイズを知りたい場合は、ハッシュテーブルにロードするデータセットに対してPROC CONTENTSを実行し、「観測長」と「データセット内のobsの数」を乗算します。必要なメモリサイズをバイト単位で指定します。あなたがそれだけのメモリを持っているなら、あなたはそれをメモリにロードすることができます。

于 2012-07-08T23:13:49.270 に答える