我有一个非常大的谷歌Multimap<String,String>
,并正在研究减少内存使用量的方法。在所有的例子中,我发现人们正在做类似的事情:
Multimaps.newSetMultimap(
TDecorators.wrap(new TIntObjectHashMap<Collection<Integer>>()),
new Supplier<Set<Integer>>() {
public Set<Integer> get() {
return TDecorators.wrap(new TIntHashSet());
}
});
适用于Multimap <Integer,Integer>
,是否可以使用Trove来包装<String,String>
?
任何人都对我的未来感兴趣 http://code.google.com/p/jdbm2/ 将哈希映射写入文件系统。
答案 0 :(得分:6)
Guava的Multimaps支持标准JDK集合,这些集合未针对内存使用进行优化。例如,ArrayListMultimap<K, V>
由HashMap<K, ArrayList<V>>
支持,HashMultimap<K, V>
由HashMap<K, HashSet<V>>
支持。
Eclipse Collections(以前为GS Collections)的Multimaps支持自己的容器类型UnifiedMap
和UnifiedSet
。 UnifiedMap
使用HashMap
的一半内存,UnifiedSet
使用HashSet
内存的四分之一。您将看到的内存优势取决于您使用FastListMultimap
还是UnifiedSetMultimap
。
有更详细的记忆比较here。
注意:我是Eclipse Collections的提交者。
答案 1 :(得分:3)
您可以查看哈希映射的内存有效变体,例如:https://code.google.com/p/sparsehash/
如果你的值字符串足够长,压缩可能是一个选项。您还可以查看磁盘支持的解决方案,例如Ehcache,具体取决于您的访问统计信息。
答案 2 :(得分:0)
Trove4j不包含string-to-string的hashmap。
请参阅http://trove4j.sourceforge.net/javadocs/gnu/trove/map/hash/package-summary.html
答案 3 :(得分:0)
我使用的方法是使用Map<String,Collection<String>>
,其值从ArrayList<String>
开始,当桶达到某个阈值(例如32个元素)时,会升级到HashSet<String>
。
我发现这为小型存储桶节省了大量内存。