2012-04-01 53 views
0

首先讓我告訴你,我已經閱讀了Java HashMap performance optimization/alternative之前詢問過的以下問題,我也有類似的問題。什麼是HashMap映射到原始類型的快速替代方法?

我想要做的是從紐約時代的文本,將由斯坦福分析器處理以提供依賴關係,並將其依賴關係存儲在散列表連同他們的分數,即如果我看到一個依賴兩次我依賴關係會將散列圖中的分數遞增1.

該任務開始非常迅速,每秒大約10個句子,但迅速縮小。在30 000個句子(假設每個句子中有10個單詞,每個單詞存儲大約3至4個依賴關係)在我的散列表中大約有300 000個條目。

我將如何提高散列表的性能?我可以使用什麼樣的hashkey?

非常感謝 馬蒂諾

編輯1:

好的球員,也許我措辭,我的問題錯誤OK,很好的字節數組並不在我的項目,但在上述其他人的類似的問題中。我不知道他們在用什麼,因此這就是爲什麼我問。

其次:

隨着一句:我認爲這將會使事情很難理解,但這裏是一個示例我不會發表碼「我要睡覺了」我有依賴關係: (我, (i,去,-1) (i,to,-3) (am,去,-1) 。 。 。 (to,bed,-1) 所有句子(1 000 000句子)的這些相關性將存儲在散列表中。 如果我看到依賴關係兩次,我會得到現有的依賴關係的分數,並添加1.

而且這是非常多的。一切都很好,但在hashmap中添加句子的速度(或檢索)在這一行上縮小: dependancyBank.put(newDependancy,dependancyBank.get(newDependancy)+ 1); 誰能告訴我爲什麼? Registers Martinos

+2

如果你能顯示更多的代碼,這將真的有幫助...例如,涉及的類型是什麼?每秒10句話聽起來很慢...... – 2012-04-01 19:26:12

+0

請考慮在最後刪除額外的問題,它將更適合作爲相關問題的評論。 – GavinCattell 2012-04-01 19:26:27

+0

你不能使用'byte []'作爲一個鍵,所以我想知道你可以使用它。 'byte []'是一個對象,你不能將一個原語放入一個HashMap中(你只能添加包裝) – 2012-04-01 19:29:07

回答

3

Trove針對鍵或值是原始類型的情況優化了hashmaps。

但是,還有很多東西還是要依賴智能選擇結構和散列碼來保存你的密鑰。

這個部分你的問題不清楚:The task starts off really quickly, about 10 sentences a second but scales off quickly. At 30 000 sentences(which is assuming 10 words in each sentence and about 3-4 dependences for each word which im storing) is about 300 000 entries in my hashmap.。但是你沒有說大數據的性能。你的地圖會增長,這很明顯。僅在理論上,HashMap僅爲O(1),實際上由於緩存局部性較小,並且由於重新哈希引起的偶然跳躍,實際上您會看到一些性能隨大小的變化。所以,put()get()時間將不會是恆定的,但他們仍然應該接近於此。也許你正在以不保證快速訪問的方式使用散列表,例如通過迭代它?在這種情況下,你的時間會隨着大小線性增長,除非你改變算法,否則你不能改變它。

+0

感謝,真的很有幫助。 – Martinos 2012-04-01 22:38:53

+1

2017年,Trove不受支持,並且有很多bug(總是有)。 fastutil,Koloboke和Eclipse集合是更好的選擇。 – leventov 2017-01-19 16:32:42

2

谷歌'fastutil',你會發現一個優秀的解決方案,將對象鍵映射到分數。

0

我將如何提高散列表的性能?

如果它的每個get()或put()超過1微秒,你有一個錯誤恕我直言。你需要確定爲什麼它只要是這樣。即使在最糟糕的情況下,每個對象都具有相同的hasCode,你不會有這樣糟糕的性能。

我可以使用什麼樣的hashkey?

這取決於密鑰的數據類型。它是什麼?

最後是什麼是byte [] a = new byte [2];字節[] b =新字節[3];在上面發佈的問題中?

它們是字節數組。它們可以用作查詢的值,但可能需要不同的值類型。

0

HashMap有一個重載構造函數,它將初始容量作爲輸入。您看到的縮放比例是因爲在哈希映射實際上不可用的情況下重新哈希。爲了防止頻繁的刷新,你需要從初始容量更大的HashMap開始。您也可以設置一個加載因子,指出在重新調整之前加載哈希的百分比。

public HashMap(int initialCapacity)

在構建對象時將初始容量傳遞給HashMap。在執行程序的過程中,最好將容量設置爲您希望添加到地圖中的元素的數量的近兩倍。

相關問題