1

非常に単純な Trie 実装を使用してテキスト予測を実装しています。これは、このコードのわずかに変更されたバージョンです。

当初の予想よりも優れたパフォーマンスを発揮しますが、OutOfMemoryError頻繁にエラーが発生しています。次のいずれかでこの問題を解決する方法についてのアイデア:

  • アプリに指定されたメモリを増やす
  • より少ないメモリを使用するように実装を最適化する

または他の提案はありますか?

コードの一部のネイティブ実装を使用することでメモリ制限の問題を回避できるという推奨事項を見てきましたが、可能であれば Java のままにしたいと考えています。

4

2 に答える 2

1

マニフェストで largeHeap をオンにしてみて、役立つかどうかを確認できます。

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

于 2013-10-23T21:11:13.627 に答える
0

実装を行うことthis.next = new Node[R];で、レベル 1 のノードに 26 個のポインタを持つ配列が割り当てられ、次にレベル 2 のノードに 26^26 個のポインタが割り当てられ、次にレベル 3 のノードに 26^26^26 個、というように割り当てられます。これが、メモリ不足の原因の 1 つになる可能性があります。

実装を変更して、すべての Node が小さい初期容量 (たとえば 5) のノードの HashMap を持つようにすることができます。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!
    }

何もしない理由は、ノードへの参照がby valueJava で渡されるためです。したがって、実際の参照はそのまま残ります。代わりにすべきことは次のとおりです。

    // 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空き領域を期待している場合。

于 2013-10-23T17:46:05.117 に答える