【问题标题】:OutOfMemoryError when trying to add elements from a B+Tree to an ArrayList尝试将 B+Tree 中的元素添加到 ArrayList 时出现 OutOfMemoryError
【发布时间】:2021-03-30 23:56:51
【问题描述】:

我正在尝试遍历 B+ 树并将叶子中的元素添加到 ArrayList 中,代码如下:

public void toArrayList(Node node){
       Node currentNode = node;
       if(currentNode instanceof InnerNode){
               InnerNode inner = (InnerNode) currentNode;
               int i = 0;
               int temp = inner.children.length;
               while(i < temp){
                   currentNode = inner.children[i];
                   toArrayList(currentNode);
                   i++;
               }


           }
       if(currentNode instanceof LeafNode){
               LeafNode leaf = (LeafNode) currentNode;
               int j = 0;
               int temp = leaf.values.length;
               while(j < temp){
                   if(leaf.values[j] != null) {
                       retArray.add(leaf.values[j]);
                   }
                   j++;
               }

           }
    }

它的作用是检查节点是内部节点还是叶节点的实例。如果它是一个内部节点,它会递归地调用它的每个子节点的函数。如果它是叶节点,则它将值添加到 ArrayList 中。然而,在运行这个函数时,我最终得到了一个java.lang.OutOfMemoryError

有没有办法让我的代码更有效率,或者我应该采取不同的方法来处理这种方法?

【问题讨论】:

    标签: java recursion tree-traversal b-tree b-plus-tree


    【解决方案1】:

    除非您的树结构中包含几百万个元素,否则这里发生的情况是某些 InnerCode 包含自身,因此此代码会一直运行下去,或者至少直到您的 retArray 填满为止。

    另请注意,如果叶节点是内部节点的最后一个子节点,则此代码将添加两次叶节点。我强烈建议你不要像这样覆盖本地人。此外,这里的 for 循环更紧凑(请注意,使此代码更小不会对内存问题产生任何影响根本;OOMError 指的是堆,而本地人并不住在那里) .

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      • 2017-10-11
      • 1970-01-01
      相关资源
      最近更新 更多