如何优化我的Trie实现,以便我不会得到OutOfMemoryError

时间:2013-10-23 17:14:20

标签: java android trie sony sony-smartwatch

我正在使用一个非常简单的Trie实现来实现文本预测,这是对code

的略微修改的版本

它的表现比我最初预期的要好,但我经常收到OutOfMemoryError。任何想法如何解决这个问题:

  • 增加指定给我的应用程序的内存
  • 优化实施以减少使用内存

或任何其他建议?

我已经看到通过使用部分代码的本机实现可以避免内存限制问题的建议,但如果可能的话,我宁愿留在Java中。

2 个答案:

答案 0 :(得分:1)

您可以尝试在清单中启用largeHeap,看看它是否有帮助:

http://developer.android.com/guide/topics/manifest/application-element.html#largeHeap

答案 1 :(得分:0)

通过执行this.next = new Node[R];,实现分配一个数组,其中26个指针指向级别1上的节点,然后26 ^ 26指针指向级别2上的节点,然后26 ^ 26 ^ 26指向级别3,依此类推。这可能是你内存不足的一个原因。

您可以尝试更改实现,以便每个Node都有一个具有较小初始容量的节点的HashMap,例如5.只有在真正需要时才会增长HashMap - 这将节省一些内存。

该代码中的另一个问题是delete

    // delete a node  
    public void delete(Node node) {  
        for(int i = 0; i < R; i++) {  
            if(node.next != null) {  
                delete(node.next[i]);  
            }  
        }  
        node = null;  // <-- this is not doing anything!
    }

它没有做任何事情的原因是对节点的引用在Java中传递by value - 因此真实的引用保持不变。你应该做的是:

    // delete a node  
    public void delete(Node node) {  
        for(int i = 0; i < R; i++) {  
            if(node.next != null) {  
                delete(node.next[i]);  
                node.next[i] = null; // <-- here you nullify the actual array item
            }                        // which makes the object a good candidate for 
                                     // the next time GC will run
        }              
    }

所以它也可能是内存泄漏 - 如果你依靠delete来释放空间。