我想对SAS散列表中存储桶的定义进行一些澄清。问题正是关于 hashexp 参数。
根据SAS DOC, hashexp 是:
哈希对象的内部表大小,哈希表的大小为2n。
HASHEXP的值用作二次幂指数来创建哈希表大小。例如,HASHEXP的值为4等于哈希表大小为24或16.HASHEXP的最大值为20.
哈希表大小不等于可以存储的项目数。想象一下哈希表是一个'桶的数组'。哈希表大小为16将有16'桶。每个桶可以容纳无限数量的物品。哈希表的效率在于哈希函数将项目映射到桶中以及从桶中检索项目的能力。
您应该相对于哈希对象中的数据量设置哈希表大小,以便最大化哈希对象查找例程的效率。尝试不同的HASHEXP值,直到获得最佳结果。例如,如果哈希对象包含一百万个项目,则哈希表大小为16(HASHEXP = 4)将起作用,但效率不高。哈希表大小为512或1024(HASHEXP = 9或10)将获得最佳性能。
问题 哈希表大小究竟是什么,而哈希对象中的数据量不是很多?
是否应该理解为我们想要分配尽可能多的内存,但不能少,不再需要。让事情快速发挥是两个人的力量。但它并没有限制可能使用的数据量,它只表明将要使用多少,对吧?
答案 0 :(得分:6)
Paul Dorfman(哈希大师)在本白皮书的第10页详细介绍了一些细节:
http://www2.sas.com/proceedings/forum2008/037-2008.pdf
据我了解,哈希表将数据存储在二叉树中。 hashexp创建的每个存储桶表示将用于存储数据的二叉树的数量。 hashexp为0将使用单个树,而hashexp为8将使用256个树。当对散列对象执行查找时,内部算法确定密钥应存在于哪个树中(基于散列值)。然后它检查该树的值。通过自动知道要查看的256个树中的哪一个(例如),与单个二叉树相比,它本身可以保存8个比较(2 ^ 8)。
整个事情看起来要复杂得多,但这是我对其解释速度更快的解释。
答案 1 :(得分:3)
正如Rob Penridge指出的那样,Paul Dorfman确实是SAS Hash Object Guru。 Hashexp与哈希表的大小无关,再次如Rob的回答所述。
如果你有一个包含100个表和10个数字变量的表加载到哈希表中,那么哈希表的大小就是100obs * 10vars * 8bytes(假设所有数字变量都存储为8字节字段)7.8KB给出或拿10%。
请记住,当记录被添加到内存中的哈希表时,SAS会动态分配RAM空间,因此您不需要事先指定它应该是什么大小。[我已经定期使用哈希表,但是不能想想任何可以预先指定大小的地方]。
一般提示:如果您想知道哈希表的大小,请在要加载到哈希表中的数据集上运行PROC CONTENTS并乘以"观察长度" &安培; "否。数据集"中的obs,这将给出所需的内存大小(以字节为单位)。如果你有那么多内存,那么你可以将它加载到内存中。