【发布时间】:2018-07-07 19:28:25
【问题描述】:
我正在尝试将大量数据加载到HashMap。目前我正在尝试推送 2000 万个条目。将这么多条目加载到此映射中时,我注意到考虑到我加载到此映射中的所有内容都是字节数组(我从 500mb 文件生成此数据,每个字节数组平均具有大小5 个,最多 11 个):
Map<Key, byte[]> result = new HashMap<>(entryCount, 1);
for (int i = 0; i < entryCount; i++) {
do {
// Read data from file, store it into result and increment count.
} while (count < MAX_COUNT);
}
还有Key 类:
public final class Key {
private final byte[] value;
Key(byte[] value) {
this.value = value;
}
// equals, hashCode, toString
}
使用jProfiler 查找消耗这么多内存的内容,我注意到HashMap$Node 是图表顶部的类之一:
我很好奇这种确切类型的数据是否有更高效的 Map 实现?
【问题讨论】:
-
您正在使用 26 meg 来存储 20 meg...
Map中是否有 ~100k 数组? -
@ElliottFrisch 我存储了 2000 万个数组。我想知道是否有任何地图实现不为每个地图元素创建
Node。对于我存储的这种特定类型的数据,也许有专门的地图实现。 -
类
Key有一个实例变量byte[] value。result映射的值类型也是byte[]。您是否将键k它的值放在地图中:result.put(k, k.getValue())?这将是多余的。该映射是不必要的,因为您需要知道键k才能从映射中获取值:result.get(k)。但是如果你有密钥k,那么你就有了它的值:k.getValue()。那么地图就不需要了。 -
@LuCio
key和我放在地图中的值完全不相关。密钥实际上是一个md5哈希。而该值由从文件中读取的字节组成。
标签: java dictionary hashmap