2012-07-06 66 views
5

我想对SAS散列表中的存储桶的定义做一点澄清。这个问题正是关于hashexp参数。hashexp指定的SAS HashTable中的表大小是什么?

根据该SAS文档,hashexp是:

散列对象的内部表的大小,其中,哈希表的大小为2n。

HASHEXP的值用作创建哈希表大小的二次幂指数。例如,HASHEXP的值为4相当于散列表大小为24或16.HASHEXP的最大值为20.

散列表大小不等于可以存储的项目数存储。将哈希表设想为一个“桶”阵列。哈希表大小为16将有16个桶。每个桶可以容纳无数的物品。散列表的效率在于散列函数将项目映射到并从桶中检索项目的能力。

您应该设置哈希表大小相对于哈希对象中的数据量,以最大限度地提高哈希对象查找例程的效率。尝试不同的HASHEXP值,直到获得最佳结果。例如,如果散列对象包含一百万个项目,则散列表大小为16(HASHEXP = 4)可以工作,但效率不高。散列表大小为512或1024(HASHEXP = 9或10)会导致最佳性能。

的问题是究竟是哈希表的大小,而不是数据的哈希对象中的量?

应该理解为我们是否想要分配尽可能多的内存,因为它可能是必需的,但不会少于,不多于。让事情快速发展是两个重要的力量。但它并不限制可能使用的数据量,它只是表示将使用多少数据,对吧?

回答

6

保罗多尔夫曼(散列的主机)进入细节的公平位本白皮书的第10页:

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

据我了解,哈希表存储在二叉树他们的数据。 hashexp创建的每个桶表示将用于存储数据的二叉树的数量。 hashexp为0将使用一棵树,而hashexp为8则使用256棵树。当对哈希对象执行查找时,内部算法将确定密钥应存在于哪棵树中(基于哈希值)。然后它检查该树的值。通过自动知道256棵树中的哪棵树进行查找(例如),与单个二叉树相比,它可以节省8次比较(2^8)。

整个事情似乎比这更复杂,但这是我解释为什么它运作得更快。

3

正如Rob Penridge指出的那样,Paul Dorfman确实是SAS Hash Object Guru。 Hashelp与哈希表的大小无关,正如Rob的回答中所述。

如果你有一个带有100b和10个数值变量的表被加载到一个散列表中,那么散列表的大小就是100obs * 10vars * 8bytes(假设所有数字变量存储为8byte字段)7.8KB给出或采取10%。

请记住,随着记录被添加到内存中的哈希表中,SAS会动态地分配RAM空间,所以您不需要事先指定它应该是多大。[我一直在使用哈希表,但不能认为任何可以预先指定尺寸的地方]。

一般提示:如果你想知道你的散列表有多大,对你要加载到散列表的数据集运行一个PROC CONTENTS,并乘以“Observation Length”&“数据集中obs的数量“,这将以字节为单位给出所需的内存大小。如果你有那么多的内存,那么你可以把它加载到内存中。

相关问题