Map
我正在使用类似于以下声明的接口实现树状结构:
Map<String, Map<String, Map<Integer, Double>>>
目前我正在使用该HashMap
实现。加载大量数据后,我看到程序消耗了 4GB 的 RAM。在使用接口持久化整个实体Serializable
时,生成的文件大小仅为 1GB。
我可以在这里使用的最节省内存的Map
实现是什么?
Map
我正在使用类似于以下声明的接口实现树状结构:
Map<String, Map<String, Map<Integer, Double>>>
目前我正在使用该HashMap
实现。加载大量数据后,我看到程序消耗了 4GB 的 RAM。在使用接口持久化整个实体Serializable
时,生成的文件大小仅为 1GB。
我可以在这里使用的最节省内存的Map
实现是什么?
如果您想将 (String,String,Integer) 映射到 Float,那么最好的办法是使用 a Map<MyKey, Float>
,MyKey
其定义如下:
public final class MyKey {
private final String a;
private final String b;
private final Integer c;
public MyKey(String a, String b, Integer c) {
this.a = a;
this.b = b;
this.c = c;
}
// getters, if needed
@Override
public int hashCode() {
return Objects.hash(a, b, c);
}
@Override
public boolean equals(Object o) {
if (o == this) {
return true;
}
if (!(o instanceof MyKey)) {
return false;
}
MyKey other = (MyKey) o;
return Objects.equal(a, o.a)
&& Objects.equal(b, o.b)
&& Objects.equal(c, o.c);
}
}
这里有两种地图。一种具有字符串键和映射值。为此,如果您可以接受不变性,我可能会使用Google Guava 的 ImmutableMap。它可能不会为您节省很多内存,但它可能会为您节省一些,并且比普通的 HashMap 执行得更好。
对于具有 Integer 键和 Double 值的其他 Map,您应该使用存储原语而不是对象的专用 Map 实现。例如看一下Trove4j 的 TIntDoubleHashMap。这将为您节省大量内存,因为原语存储为原语而不是对象。