Java Multimap <string,string> with Trove </string,string>

时间:2013-03-22 20:09:22

标签: java multimap trove4j

我有一个非常大的谷歌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/ 将哈希映射写入文件系统。

4 个答案:

答案 0 :(得分:6)

Guava的Multimaps支持标准JDK集合,这些集合未针对内存使用进行优化。例如,ArrayListMultimap<K, V>HashMap<K, ArrayList<V>>支持,HashMultimap<K, V>HashMap<K, HashSet<V>>支持。

Eclipse Collections(以前为GS Collections)的Multimaps支持自己的容器类型UnifiedMapUnifiedSetUnifiedMap使用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>

我发现这为小型存储桶节省了大量内存。