4

我有一个相当大的谷歌Multimap<String,String>,正在寻找减少内存使用的方法。在所有示例中,我发现人们正在做类似的事情:

Multimaps.newSetMultimap(
TDecorators.wrap(new TIntObjectHashMap<Collection<Integer>>()),
new Supplier<Set<Integer>>() {
public Set<Integer> get() {
  return TDecorators.wrap(new TIntHashSet());
}
});

哪个适用于 a Multimap <Integer,Integer>,是否可以使用 Trove 包装 a <String,String>

如果有人对未来感兴趣,我使用 http://code.google.com/p/jdbm2/ 将哈希映射写入文件系统。

4

4 回答 4

6

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

Eclipse Collections(前身为GS Collections)拥有由其自己的容器类型支持的 Multimap,UnifiedMap并且UnifiedSet. UnifiedMap使用一半的内存HashMapUnifiedSet使用四分之一的内存HashSet。您将看到的内存优势取决于您使用的是 aFastListMultimap还是 a UnifiedSetMultimap

此处提供了更详细的内存比较。

注意:我是 Eclipse Collections 的提交者。

于 2013-09-03T17:00:44.260 回答
3

您可以查看哈希映射的内存高效变体,例如这个:https ://code.google.com/p/sparsehash/

如果您的值字符串足够长,则可以选择压缩。您还可以查看磁盘支持的解决方案,例如 Ehcache,具体取决于您的访问统计信息。

于 2013-03-22T20:38:11.567 回答
0

Trove4j 不包含字符串到字符串的 hashmap。

http://trove4j.sourceforge.net/javadocs/gnu/trove/map/hash/package-summary.html

于 2013-03-22T20:27:48.320 回答
0

我使用的一种方法是使用Map<String,Collection<String>>值开始的位置,并在存储桶达到某个阈值(例如 32 个元素)时ArrayList<String>提升到该值。HashSet<String>

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

于 2013-06-26T11:23:41.287 回答