哈希地图空间问题

时间:2012-03-29 18:42:52

标签: java hashmap ehcache berkeley-db tokyo-cabinet

在我的Java代码中,我使用的是Guava的Multimap(com.google.common.collect.Multimap):

 Multimap<Integer, Integer> Index = HashMultimap.create()

这里,Multimap键是URL的一部分,值是URL的另一部分(转换为整数)。现在,我分配了我的JVM 2560 Mb(2.5 GB)堆空间(通过使用Xmx和Xms)。但是,它只能存储9百万这样的(键,值)整数对(大约1000万)。现在,问题是,我可以为JVM提供有限数量的内存(比如2 GB)。

所以,任何人都可以帮助我,

1)是否有另一种解决此内存问题的方法或自制解决方案?意味着,基于磁盘/数据库的多地图是一个不错的解决方案吗?我从一些网络文章中读到,有一些基于DB /磁盘的解决方案来解决这个问题。 Berkley DBEhcache。任何人都能告诉我(或哪一个)是否更快?

2)那些基于磁盘/数据库的多地图是否存在性能问题(我要求存储和搜索)?

3)任何想法或信息如何简单地使用它们。

4)任何其他想法对我都很好。

注意:我想要针对上述问题的Multimap(密钥可以有多个值)解决方案。我还必须考虑存储和搜索的性能。

2 个答案:

答案 0 :(得分:2)

JDBM3是一个非常快速的磁盘上HashMap / TreeMap(B + Tree)库,据称比berkeley db快4倍。数十亿条记录可以存储在地图中。它在内部进行缓存,因此由于磁盘访问,映射操作不会变慢。

DB db = DBMaker.openFile(fileName).make();
Map<Integer,Integer> map = db.createHashMap("mapName");
map.put(5, 10);
db.close()

它没有Multimap,但值可以是Set / List。

答案 1 :(得分:1)

你当然不会在2.5 GB的内存中存储1亿对Integer个对象。如果我没弄错的话,Integer将在Oracle / Sun JVM中使用至少16个字节的内存(并且对齐也是16个字节),这意味着Integer s的内存为3.2 GB单独,没有任何结构。

使用此数据大小,您绝对应该使用磁盘支持的内容,或者使用具有大量内存和/或优化数据结构的服务器(特别是尝试避免基本类型包装器)。我已经使用H2来完成类似的任务并发现它非常好(它可以使用映射文件来访问磁盘而不是读取),但我没有与其他类似的库进行任何比较。