2016-10-23 3 views
0

10 GBのファイルを読み込み、ファイル内で最も頻繁に使用されるフレーズを探す必要があります。 私はスキャナを使って塊でファイルを読んでおり、フレーズを Trieデータ構造に格納しています。 フレーズを後で検索してカウントを更新し、効率的な検索にトライデータ構造を使用しました。私はTrie を以下のようにjavaでHashmapを使って実装しました。Javaのメモリを効率的に実装する

class TrieNode { 
     char data; 
     Map<Character, TrieNode> children = new HashMap<>(); 
     boolean isLeafNode; 
     int positionMinHeap = -1; 
     int frequency; 

     TrieNode() { 

     } 

     TrieNode(char data) { 
      this.data = data; 
     } 

    } 

しかし、この解決策は、多くのヒープスペースを消費します。そしてファイル内のすべてのフレーズが異なる場合、Trieは膨大なスペースを取るでしょう.Trieをメモリ効率の良い方法で実装できる他の方法はありますか?

+0

私はtop-k [ストリーム要約](http://www.cse.ust.hk/~raywong/comp5331/References/EfficientComputationOfFrequentAndTop-kElementsInDataStreams.pdf)アルゴリズムを使用します。たとえば、CountMinSketchを使用して周波数をトラッキングし、最大のメモリ内のk個だけを保持し、高い周波数として置き換えることが検出されます。 –

+0

基数ツリーの実装はどうですか? https://en.wikipedia.org/wiki/Radix_tree –

答えて

0

C++とJNIのバインディングが気になることがなければ、最適化されたソリューションの選択肢が増えます。私は試してみることをお勧めしたい魔理沙をトライ:私はしばらく前にいくつかの他のライブラリを試してみた(残念ながら、私は今、他の人を覚えていない)とのための私のデータは marisa-を設定

https://github.com/s-yata/marisa-trie/tree/master

trieは、他のC++トライライブラリに比べて、パフォーマンスとメモリ使用量のバランスが非常に良好でした。

データが大きくなると(もちろんパフォーマンスを犠牲にして)、メモリマップIOインターフェイスのメリットが得られます。

関連する問題