什么是最节省内存的数据结构可以满足我的目的?

时间:2017-10-18 18:02:53

标签: java memory-management data-structures hashmap memory-optimization

我试图对继续运行OOM的服务器进行内存优化。

服务器中的大多数对象(按计数)采用以下形式:

  • 每个对象都是HashMap
  • HashMap键是字符串
  • HashMap值是Attribute类的对象,它只有一个int和2个布尔值。

重要提示:95%的此类哈希映射只有一个密钥;我知道在创建hashmap时是否就是这种情况。

这些哈希图有数百万个。

我已经问了一个关于优化这些哈希映射内存的单独问题,并且评论中有人建议可能重新设计我的整个数据结构会更好,因为即使初始大小为" 1" HashMaps仍占用额外的内存。

因此,我的问题是;我可以实现更好的Java数据结构,它可以存储相同的精确数据,具有更好的内存效率吗?

注意:我需要能够查找特定值是否作为密钥存在;因此我考虑但拒绝将数据存储在[string_value,int,boolean,boolean]的五元组列表中。

2 个答案:

答案 0 :(得分:2)

向用户公开不太具体的def report(ticket,winner): kiss = [] Love = [] x = 0 y = 0 # because we are checking different length lists, set ticket to longest list if len(ticket) > len(winner): pass elif len(winner) > len(ticket): temp = ticket ticket = winner winner = temp for i, number in enumerate(ticket): try: if winner[i] == number: x+=1 else: y+=1 except IndexError: y+=1 kiss.append(x) kiss.append(y) print kiss l1 = [1,2] l2 = [1,2,3] report(l1, l2) # prints [2, 1] l1 = [1,3] l2 = [1,2,3] report(l1, l2) # prints [1, 2] 接口而不是Map,这样您就可以根据具体情况自由使用哈希映射或单例映射。

可以通过HashMaphttps://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#singletonMap(K,%20V)

创建符合内存的单身地图

Collections.singletonMap()似乎是作为一个只有两个字段和一些缓存的对象实现的:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collections.java#Collections.SingletonMap

P.S。通过将地图和值折叠到单个实例中,您可以为您的特殊情况提供更紧凑的东西:

SingletonMap

p.p.s属性中的整数是否有最大值?你可能会做这样的技巧(这实际上是否会节省内存将取决于填充/对齐,请参阅What is the memory consumption of an object in Java?):

public final class SingletonAttributeMap extends Attribute implements Map<String,Attribute> {

  private final String key;

  public Attribute get(String key) {
    return this.key.equals(key) ? this : null;
  }

  ....
}

答案 1 :(得分:1)

每个对象都是HashMap?不是一个很好的抽象。我更喜欢组合:创建一个HAS-A HashMap并提供清晰API的对象。使它可比较并实现hashCode和equals。

我建议您遵循Flyweight模式,如果重复这些模式的话。

如果对象是不可变的并且只读,那么这将是一个非常好的优化。

拥有Factory对象来创建实例并维护唯一的实例列表。如果有人要求已经在List中的那个人返回不可变副本。

您可以在实施之前计算出这将节省多少内存。