【问题标题】:How efficiently can we store all tree nodes into HashMap?我们如何有效地将所有树节点存储到 HashMap 中?
【发布时间】:2013-05-02 15:04:57
【问题描述】:

我们正在尝试将所有树节点以线性方式存储到 HashMap 中(一个接一个地遍历一个节点)并且遇到内存问题(OutOfMemoryError: Java heap space),最大内存设置为 90mb (-Xmx90M)

这是我们正在使用的代码(在 HashMap 中包含 HashMap):

HashMap<Integer, MyNode> refNodeMap
HashMap<String, HashMap<Integer, MyNode>> spNodeMap;
String Id;

toCopy 是 MyNode 对象类型。

if (refNodeMap.containsKey(Id)) {
    spNodeMap.get(Id).put(toCopy.getId(), toCopy);
} else {
    spNodeMap.put(Id, new HashMap<Integer, MyNode>());
    spNodeMap.get(Id).put(toCopy.getId(), toCopy);
}
  1. 我们能否避免将 innerHashMap 与类对象一起使用?如果可以,该类的外观如何?
  2. 我们如何有效地将所有树节点存储到 HashMap 或任何其他集合中以便以后检索?

【问题讨论】:

  • 您要存储的数据/信息到底是什么?以及您将如何/在哪里使用它们
  • 使用 HashMap 在树中实现节点是一个糟糕的主意。 HashMap 有很多存储开销。
  • 您可能应该解释一下在您的情况下什么是“树节点”以及为什么将它们放入哈希图中。有多少节点是“所有”节点?一定数量的节点总是会耗尽内存。
  • 90M?这是很小的内存量。小于默认金额。你为什么把自己限制在这么少的范围内?
  • 树节点是我的自定义类对象之一。构建超集树后,在选择该节点时,基于节点 ID,我需要显示一个详细信息表。因此存储它如果 HashMap 是存储开销,有人可以推荐我如何存储它吗?

标签: java collections map hashmap


【解决方案1】:

正如我所说,将 HashMaps 用作树中的节点是一个糟糕的主意——超过几百个元素的开销会吃掉你。

但对于字符串节点 ID,您可以使用带有连接 ID 值的单个 HashMap,例如“a.b.c”或“a/b/c”。您不能很好地“遍历”树,但您可以非常有效地找到特定元素。

【讨论】:

  • 树节点是我的自定义类对象之一。构建超集树后,在选择该节点时,基于节点 ID,我需要显示一个详细信息表。因此存储它如果 HashMap 是存储开销,有人可以推荐我如何存储它吗?
猜你喜欢
  • 2022-12-17
  • 1970-01-01
  • 1970-01-01
  • 2014-01-18
  • 1970-01-01
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
相关资源
最近更新 更多