Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中内存效率最高的映射_Java_Memory Management_Map - Fatal编程技术网

java中内存效率最高的映射

java中内存效率最高的映射,java,memory-management,map,Java,Memory Management,Map,我正在使用Map接口实现一个树状结构,如下所示: Map<String, Map<String, Map<Integer, Double>>> Map 目前我正在使用HashMap实现。 在加载了大量数据之后,我看到程序消耗了4GB的RAM。 使用Serializable接口持久化整个实体时,生成的文件大小仅为1GB 我可以在这里使用的内存效率最高的Map实现是什么?这里有两种映射。具有字符串键和映射值的一种。如果不变性适合你,我可能会用它。它可能不会为您

我正在使用
Map
接口实现一个树状结构,如下所示:

Map<String, Map<String, Map<Integer, Double>>>
Map
目前我正在使用
HashMap
实现。 在加载了大量数据之后,我看到程序消耗了4GB的RAM。 使用
Serializable
接口持久化整个实体时,生成的文件大小仅为1GB


我可以在这里使用的内存效率最高的
Map
实现是什么?

这里有两种映射。具有字符串键和映射值的一种。如果不变性适合你,我可能会用它。它可能不会为您节省很多内存,但它可能会为您节省一些内存,并且比普通HashMap的性能要好一点

对于另一个具有整型键和双值的映射,应该使用存储基本体而不是对象的专用映射实现。举个例子来看。这将为您节省大量内存,因为基本体存储为基本体而不是对象。

如果您想将(字符串、字符串、整数)映射为浮点,那么最好使用
映射
,其中
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);
    }
}

使用地图是正确的解决方案吗?您是否应该使用
列表
第一级节点
持有
列表
第二级节点
持有
列表
?使用列表不会影响检索性能。我可以用更大的加载时间,但检索时间是我试图保存在这里。也许。我们不知道你在用你的树做什么。把这个结构称为树是很奇怪的。它确实是树形的,假设映射中的所有值都没有超过一个键。否则,您将有一个图表。为了给您最好的答案,您需要描述此结构的访问模式。您手头通常有两个字符串和一个整数,您想为它们找到相应的双精度值吗?或者你需要抓取子树(比如,给定第一个字符串)并传递它们吗?重申:这真的是从复合键(两个字符串和一个整数组成的元组)到双精度的映射吗?我只想映射一个(字符串,字符串,整数)->浮点。由于此类数据量很大,因此在这里实现最有效的方法非常重要。这是一种正确的方法,但它没有解决OP的问题,即在结构消耗的内存方面,哪种方法最有效。这里我们添加了每个键四个对象头的开销。还有另一种设计,每个键只使用两个头:一个环绕字节数组的伪类型。@seh的解决方案+1。真正的问题是避免三个嵌套映射产生的开销;更奇特的方法需要更多的工作才能获得最小的收益。同意。但它已经比地图中的地图更有效率了。我会先给出一个清晰简单的解决方案,然后再看看是否需要额外的优化。当然,但OP没有问他是否应该关心这些事情。他说是的,我相信他的话,他希望通过我们的回答(在本例中,还有我们的探索性问题)了解更多关于存储开销的信息。@seh-我看不出这是一个解决方案。在这里,您将(字符串、字符串、整数)映射到整数类型的唯一哈希代码。在我的例子中,这可能不可能,因为有大量这样的数据,2^32个整数不能代表所有数据。我的数据量将远远超过这个数字。