簡體   English   中英

嘗試將 B+Tree 中的元素添加到 ArrayList 時出現 OutOfMemoryError

[英]OutOfMemoryError when trying to add elements from a B+Tree to an ArrayList

我正在嘗試遍歷 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++;
               }

           }
    }

它的作用是檢查節點是內部節點還是葉節點的實例。 如果它是一個內部節點,它會遞歸地調用 function 及其每個子節點。 如果它是葉節點,則它將值添加到 ArrayList 中。 但是,在運行此功能時,我最終得到了java.lang.OutOfMemoryError

有沒有辦法讓我的代碼更有效率,或者我應該采取不同的方法來處理這種方法?

除非你的樹結構中有幾百萬個元素,否則這里發生的事情是一些 InnerCode 包含它自己,因此這段代碼會一直運行下去,或者至少直到你的retArray填滿。

另請注意,如果葉節點是內部節點的最后一個子節點,則此代碼將添加兩次葉節點。 我強烈建議你不要像這樣覆蓋本地人。 此外,這里的 for 循環更加緊湊(請注意,縮小此代碼不會對memory問題產生任何影響;OOMError 指的是堆,而本地人並不住在那里)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM