2

在我的 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)。但是,它只能存储 900 万个这样的(键、值)整数对(大约 1000 万个)。现在,问题是,我只能为 JVM 提供有限的内存(比如 2 GB)。

那么,有谁能帮帮我,

1)是否有另一种方法或自制的解决方案来解决这个内存问题?意思是,基于磁盘/数据库的多映射可以是一个不错的解决方案吗?我从一些网络文章中读到,有一些基于 DB/Disk 的解决方案可以解决这个问题。Berkley DBEhcache。谁能告诉我(或哪一个)更快?

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

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

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

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

4

2 回答 2

2

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

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

于 2012-03-29T20:05:48.400 回答
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。

于 2012-03-30T19:34:35.670 回答