2017-08-10 44 views
-1

我知道hashmaps是存儲密鑰及其值的好方法。比方說,我想存儲數百萬字的數量,或者具體地說可以說我有一個512 GB的文件,我的散列表最好是512 GB(字符串,整數)。java中的大型HashMap可以存儲嗎?

如果我有一個8GB的RAM,我可以將所有的hashmap存儲在我的電腦上嗎?假設我有1 TB的二級存儲?

任何人都可以解釋爲什麼嗎?

+0

這還不清楚。如果您擁有8GB的RAM,則無法創建512GB的地圖。那麼,假設你不使用虛擬內存,這會使工作非常緩慢。如果在這種情況下使用某種數據庫,你會做得更好。 – RealSkeptic

+0

@RealSkeptic所以java只將它的所有變量存儲在主內存中? – LoveMeow

+0

基本上,它將所有對象存儲在堆中,這是從機器的可用內存中分配的,如果它大於機器的RAM,可能會部分降級到磁盤,但這是應該避免的非最佳設置。 – RealSkeptic

回答

2

可以說我有一個512 GB的文件,我的散列圖可以在最壞的情況下 是512 GB(字符串,整數)。

您不能通過這種方式確定HEAP佔用的內存大小。
文件編碼問題和Java對象還具有對使用記憶效應特異性:在類領域,String情況下,也可以緩存,等等

無論如何,加載在內存中,做512文件GB通常是一個壞主意。 以及在地圖中存儲數百GB的對象。

數據庫旨在做這種事情。
爲了提高訪問性能,您仍然可以使用緩存最常訪問數據結果的應用緩存。

+0

所以答案是內存會溢出?可能存儲的hasmap的最大大小是多少? (出於好奇?) – LoveMeow

+0

'OutOfMemoryError'很可能。如上所述,這樣評估非常困難。爲什麼不嘗試?在地圖中添加的每個值增加一個計數器並顯示該計數器,您將具有確切的大小。您也可以使用JVisualVM工具監視已用內存並瞭解映射如何使用此內存 – davidxxx

+0

@davidxxx如果您使用java8,則不會再遇到OutOfMemoryError。檢查這個[Java 8 Metaspace](https://www.quora.com/How-is-garbage-in-Java-8-Masaspace-collected) –

相關問題