我试图对继续运行OOM的服务器进行内存优化。
服务器中的大多数对象(按计数)采用以下形式:
重要提示:95%的此类哈希映射只有一个密钥;我知道在创建hashmap时是否就是这种情况。
这些哈希图有数百万个。
我已经问了一个关于优化这些哈希映射内存的单独问题,并且评论中有人建议可能重新设计我的整个数据结构会更好,因为即使初始大小为" 1" HashMaps仍占用额外的内存。
因此,我的问题是;我可以实现更好的Java数据结构,它可以存储相同的精确数据,具有更好的内存效率吗?
注意:我需要能够查找特定值是否作为密钥存在;因此我考虑但拒绝将数据存储在[string_value,int,boolean,boolean]的五元组列表中。
答案 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
,这样您就可以根据具体情况自由使用哈希映射或单例映射。
可以通过HashMap
:https://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中的那个人返回不可变副本。
您可以在实施之前计算出这将节省多少内存。