c ++和java中地图对象的最大大小是多少?

时间:2011-12-20 17:55:53

标签: java c++ hashmap

c ++和java中hashmap / map对象的最大大小是多少?我想使用hashmap,但我正在处理大量数据。我担心如果我在大数据上使用它,它可能会因为容量限制而崩溃。是这样吗?如果是这样,可以采用哪种替代方式?

9 个答案:

答案 0 :(得分:3)

在Java中,size()的{​​{1}}类型为HashMap,因此地图中有2 ^ 31-1个元素的上限。

在C ++中,map::max_size返回最大值。元素数量。在香草int中,最多只有map元素的上限,在现代硬件上是2 ^ 64-1。

答案 1 :(得分:2)

在C ++中,std::map具有max_size()成员函数(对应于它可以容纳的数据量)。

sizeof(std::map<...>)将为您提供实际对象的大小(对应于实际对象的大小,而不是它所拥有的数据)。

答案 2 :(得分:2)

std :: map和hashmap是动态结构。它们随着元素的添加而增长,直到系统能够为它们提供内存。

max_size()成员函数给出了类实现(在代码中)能够维持的上限,但是该限制通常比代码本身运行的系统容量更宽。

系统可用内存还取决于系统除了运行应用程序之外还做了什么。

通过查询操作系统可以为进程提供的可用内存量,并根据元素的大小将其除以“键加值加一些开销(通常为20/24字节),可以凭​​经验得出一个合理的数字)”。

答案 3 :(得分:2)

对于Java:

HashMap有一个底层存储是一个数组,总是2的大小。最大的可能是2 ^ 30。如果默认负载系数为0.75,它将尝试增加并失败,大约有7.5亿个条目。

TreeMap不受限制,可以有超过2 ^ 31个条目(但size()将返回MAX_VALUE)类似于ConcurrentSkipList和ConcurrentHashMap。

答案 4 :(得分:2)

要记住的一些信息(大图):

如果您的数据很大,则无法将其保存在内存中。你必须去二级存储:硬盘。当你去硬盘驱动器时,你会失去哈希映射的速度优化。每次你去硬盘驱动器都会产生延迟(寻找时间等)。搜索存储在磁盘上的hashmap变为线性时间。

我想说的是,如果你的数据不适合内存,地图就没用了。

更好的解决方案是索引数据。将索引存储在内存中,并指向磁盘上您要查找的数据的位置。从磁盘检索数据。

使用RAID进行存储,进一步改进此模型。 同样转到DB也会导致与硬盘相同的延迟。

我建议您将所有值存储在数据库中,并保留一个内容字典,并将哈希作为键。

答案 5 :(得分:0)

在Java中,Hashmap的大小受JVM内存的限制。它可以增长。据我所知,没有硬限制。

不了解C ++。

答案 6 :(得分:0)

没有明确的最大大小 - 这取决于您的平台和STL的实现。例如,如果你有高度分散的内存,并且实现使用连续的缓冲区(我怀疑,因为通常只有矢量这样做),那么在你的计算机内存耗尽之前很久你就会用完空间。

或者,如果在实现中容器扩展时分配了小块,则内存限制是计算机具有的内存和操作系统中设置的限制的组合(如果ulimit恰好设置为Linux或其他任何Windows变体。)

该类确实有一个max_size()成员函数,但是如果你没有设置它不应该影响你。所以,简单的答案 - 除了依赖于您自己的计算机和操作系统的那些之外没有限制。

答案 7 :(得分:0)

您实际上会受到系统内存容量的限制。

如果您正在使用大数据,请考虑这些大数据的来源。并以一种将大量数据留在原处的方式设计地图。

答案 8 :(得分:0)

Java或C ++本身不是限制。在实践中,您仅受资源限制。

根据您的要求,方法可能是:

  • Patricia trie等更紧凑的结构
  • 数据库解决方案或基于文件的地图
  • 基于DHT的分布式解决方案

尝试查看here以获取一些提示。