【发布时间】:2013-04-05 15:22:01
【问题描述】:
我正在尝试在 Java 中构建一个数据结构,我将在其中插入大约 200,000 个字符串键,每个“平均”为 1000 个整数 Map<String, Arraylist<Integer>>。该地图最终将有大约 2 亿个值。
问题是在插入时,我必须首先检查映射中是否存在键,如果为真,则获取存储在临时集合中的所有值,然后将新整数添加到集合中并将它们放回映射中,或者用一个新的整数实例化一个新的集合。
当我到达一个集合包含大约 50000 个整数的地步时,这太慢了。我通常会遇到 java out of heap space 错误。
有没有办法摆脱 get 过程?我只检查键是否存在,然后立即将值添加到现有集合中,例如将 posh 添加到堆栈中,尤其是映射在内存中,或者它是导致 Java 和 C++ 之间差异的原因,在 C++ 中我可以从使用指针中受益吗?
保持这样一个事实,即我不喜欢通过使用多图之类的东西来增加地图的大小,因为结构看起来几乎很简单。
非常感谢。
【问题讨论】:
-
Multimap实现不会比Map<String, ArrayList<Integer>>消耗更多的内存。 -
你为什么不给我们看一些代码?
-
实际上,如果在地图中找不到键,您只需要执行 put。添加相关的 SSCCE。
-
200,000,000 个对象?希望你有一个 64 位系统。第一步是从
Integer移动到至少int(需要int[]而不是List),或者您可以使用BitSet之类的东西。 IIRC,它是-Xmx来提高最大堆大小。 -
告诉我们更多关于键和值的结构。您可以使用一些技巧来提高效率,甚至比下面的建议还要多。我在想,如果您的按键设计得很好,
TrieMap可能会很有用。
标签: java data-structures map multimap