【问题标题】:How to optimize my Trie implementation so that I don't get OutOfMemoryError如何优化我的 Trie 实现,以免出现 OutOfMemoryError
【发布时间】:2013-10-23 17:14:20
【问题描述】:

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

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

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

或任何其他建议?

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

【问题讨论】:

    标签: java android trie sony sony-smartwatch


    【解决方案1】:

    您可以尝试在清单中打开 largeHeap 看看是否有帮助:

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

    【讨论】:

    • 我认为它仍然与答案相关,因为它指的是选项 a:如何增加分配给我的应用程序的内存。
    • 太好了,很高兴知道它有效。当然,另外优化实现将是有益的,而 largeHeap 有一些限制,正如 android 开发者页面所指出的那样。
    【解决方案2】:

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

    您可以尝试更改实现,以便每个节点都有一个初始容量较小的节点的 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 传递 - 所以 real 引用保持不变。你应该做的是:

        // 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 来释放空间。

    【讨论】:

    • 不,根本不使用删除。我正在实现一个文本建议机制,所以我经常需要 26 个指针中的大部分。我原以为使用HashMap 在性能方面会更差,但我可以试试看!
    • @AmirAfghani 您是否仔细查看了我通过链接发布的代码,您会注意到没有调用删除,所以再次发布的代码很好地描述了问题.顺便说一句,你说的那个“哎呀”是什么意思?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 2010-10-15
    相关资源
    最近更新 更多