2017-10-18 117 views
-1

我有一种情况,在我的服务器中有大量的hashmaps(数百万和数百万),其中95%的字面上只有一个键。如何避免将我的hashmaps增加到2个键直到我尝试添加第二个键?

服务器内存不足;这可能与初始HashMap默认大小为16的事实有关,因此对于每个HashMap对象,我都浪费了大量内存。

用一个新的数据结构重新设计服务器的缺点,该数据结构将数据灵活地存储为1个元素或整个hashmap(我宁愿避免),我试图首先通过更改初始大小以1:

Map<String, Type2> myMiniMap = new HashMap<>(1); 

但是,我担心的是,由于在包含HashMap 0.75默认加载因子,这将立即得到提高到2的那一刻我的第一个键添加到地图(因为1*0.75 < 1,这是怎么我理解Java中的哈希大小调整逻辑)

假设我上面的理解是正确的(默认情况下,Java一旦我将第一个键添加到散列,将创建一个2键的空间),有没有办法阻止这种情况发生,直到我真的尝试插入第二个键

例如,我应该将loadFactor设置为零还是一个?

+2

*为什么*你有所有这些地图?这听起来像数据结构确实需要解决。 – chrylis

+0

您需要设置容量= 2,或者您可以设置capacity = 1和loadFactor> 1.0。但是,这两种选择之间的差异并不会对你的内存消耗产生显着影响 - 因为大约5%的数据具有多于1个密钥,所以比HashMap –

+0

@chrylis内部浪费的空间大得多。我不确定创建自定义类是否会导致更糟糕的内存使用,说实话,以及更难理解 - 所以我宁愿从代码可读性的角度探索那些不那么复杂的解决方案第一。然而,如果你认为有一个解决这个问题的内存优化类,请让我知道,我会问作为一个单独的问题,所以你可以张贴作为回答/ – DVK

回答

1

如果他们真的只会成为单身人士,为什么不使用Collections.singletonMap来创建他们?这个缺点是创建的地图是不可变的。

或者,您可以创建自己的类实现Map,它将在类字段中存储一个键和值,然后如果尝试添加第二个键值,它将切换到使用HashMap作为其默认支持商店。这将比完成困难更繁琐。

+0

与默认大小为1的简单HashMap相比,这样的类(切换到HashMap)的内存性能如何? – DVK

相关问题