2011-12-20 87 views
3

C++和java中hashmap/map對象的最大大小是多少?我想使用hashmap,但我正在處理大量數據。我擔心如果我在大數據上使用它,它可能會因爲容量限制而崩潰。是這樣嗎?如果是這樣,可以採取什麼替代方法?C++和java中地圖對象的最大尺寸是多少?

+4

它有多大? – kennytm 2011-12-20 17:58:04

+3

海量數據有多大? – Grammin 2011-12-20 17:58:34

+5

你有沒有考慮過使用數據庫? – Marcelo 2011-12-20 17:59:03

回答

2

在C++中,std::map有一個max_size()成員函數(對應於它可容納的數據量)。

sizeof(std::map<...>)會給你實際對象的大小(對應於實際對象的大小,而不是它所保存的數據)。

+0

......但「實際對象的大小」並不代表什麼;這對於實際的內存使用來說是一個非常小的下限,只能由分配器使用。 – 2011-12-20 18:00:07

+0

這些表達式都不會報告整個地圖使用的實際內存。 – 2011-12-20 18:00:35

+0

@德魯,不,但是第一個人正好回答了OP的要求。 – 2011-12-20 18:01:25

0

在Java中,Hashmap的大小由JVM內存限定。它可以增長的規模。就我所知,沒有硬性限制。

不知道C++。

+4

有一個硬限制:int的最大值,因爲這是size()的返回類型。 – 2011-12-20 18:02:59

0

顯式沒有最大大小 - 它取決於您的平臺和STL的實現。例如,如果你的內存高度分散,並且實現使用連續的緩衝區(我懷疑這是因爲通常只有向量纔會這樣做),那麼在計算機內存耗盡之前,可能會用盡空間。

或者,如果在實現中容器擴展時分配了小塊,則您的內存限制是您的計算機具有的內存和您在OS中設置的限制的組合(如果ulimit恰好設置在Linux中或任何Windows的變體)。

該類確實有一個max_size()成員函數,但是如果你沒有設置它,它不應該影響你。所以,簡單的答案 - 除了依賴於您自己的計算機和操作系統的限制外,沒有限制。

3

在Java中,HashMapsize()的類型爲int,所以在地圖中存在2^31-1元素的上限。

在C++中,map::max_size返回最大值。元素的數量。在一個vanilla map中,有一個至多爲SIZE_T_MAX元素的上界,在現代硬件上是2^64-1。

0

您實際上將受到系統內存容量的限制。

如果您正在使用巨大的數據,請考慮這些龐大的數據來自何處。並以一種將大量數據保留在原來位置的方式設計您的地圖。

0

Java或C++本身不是限制。在實踐中,你只受到資源的限制。

從您的要求根據辦法可能是:

  • 更緊湊的結構,如帕特里夏特里
  • 數據庫解決方案或基於文件的地圖
  • 基於分佈式DHT解決方案

嘗試看看here爲一些技巧。

2

std :: map和hashmap是動態結構。它們隨着元素的添加而增長,直到系統能夠爲它們提供內存。

max_size()成員函數給出了類實現(代碼中)能夠承受的上限,但該限制通常比代碼本身運行的系統容量更寬。

系統可用內存還取決於系統除了運行應用程序還在做什麼。

通過向操作系統查詢它可以爲您的進程提供的可用內存量,您可以根據經驗確定一個合理的數量,並將其除以元素大小爲「鍵加值加上一些開銷(通常爲20/24字節)」。

2

對於Java:

HashMap具有一個底層存儲是一個數組它總是2的大小的功率。最大可以是2^30。使用0.75的默認加載因子時,它將嘗試增加並且在大約7.5億個條目上失敗。

TreeMap不受限制,並且可以有2^31個條目(但size()將返回MAX_VALUE)類似於ConcurrentSkipList和ConcurrentHashMap。

2

有些信息要記住(大圖):

如果你的數據是巨大的,你不能在內存中保留它。你必須去輔助存儲:硬盤。當你去HDD時,你會失去hashmap的速度優化。每當你去到硬盤驅動器,你會招致延誤(尋找時間等)。搜索存儲在磁盤上的hashmap變成線性時間。

我想說的是,如果你的數據不能適應內存,地圖是無用的。

更好的解決方案是索引您的數據。將索引存儲在內存中,並有一個指向磁盤上您正在查找的數據的位置的指針。從磁盤檢索數據。

通過使用RAID存儲進一步改進此模型。 同樣去DB的結果與去HDD的延遲相同。

我建議你將所有的值存儲在一個數據庫中,並保存一個以散列值作爲關鍵字的內存字典。

相關問題