2012-07-06 69 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的數量「,這將以字節爲單位給出所需的內存大小。如果你有那麼多的內存,那麼你可以把它加載到內存中。

相關問題