c ++和java中hashmap / map对象的最大大小是多少?我想使用hashmap,但我正在处理大量数据。我担心如果我在大数据上使用它,它可能会因为容量限制而崩溃。是这样吗?如果是这样,可以采用哪种替代方式?
答案 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 ++本身不是限制。在实践中,您仅受资源限制。
根据您的要求,方法可能是:
尝试查看here以获取一些提示。