2016-12-24 4 views
1

私はプロジェクトに取り組んでおり、大規模なハッシュマップで終わるので、今は値でソートしようとしています。大きなハッシュマップをメモリ上で効率よくソートするにはどうすればいいですか?

ArrayList<Map.Entry<String, Integer>> entries = new ArrayList<Map.Entry<String, Integer>>(BloomFilter.map.entrySet()); 

しかし、これを行うと、OutOfMemoryErrorが発生します。

これを防ぐ方法はありますか?

編集:これそれはブルームフィルタ機能で

hash1 = MurmurHash2.hash32(genom); 
    hash2 = genom.hashCode(); 
    inList = true; 

    for (int i = 0; i < k-1 ; i++) { 

     hashedGenom = (hash1 + hash2 * i) % a.size(); 
     hashedGenom = CheckForNegative(hashedGenom); 

     if(!(a.get(hashedGenom))){ 

      a.set(hashedGenom); 
      inList = false; 
     } 
    } 

    return inList; 

だ場合、私のこれが私のイムブルームフィルタをやっている。ここで

 if(CheckIfThere(s, k, fBitset)){ 

     // System.out.println("var"); 
     val = map.get(s); 

     if(val != null){ 
      map.put(s, map.get(s) + 1); 
      //map.remove(s); 
      //map.put(s, new Integer(val + 1)); 
     }else{ 


      map.put(s,1); 

     } 

は、私は、文字列を取得し、基本的に午前とCheckIfThereに送信し、それが真実なら、私はそれをハッシュマップに入れます。

+0

どのくらい大きいですか? VMに十分な大きさのヒープを与えていますか? – pvg

+0

'BloomFilter.map.entrySet()'は何をしますか? – teppic

+0

Collections.sort(エントリは、新しいコンパレータ<のMap.Entry <文字列、整数>>(){ \t \t \t \t @Override \t \t \t \t公共INT(エントリ<文字列、整数>まず、エントリ<文字列を比較します、整数>秒){ \t \t \t \t \tリターンsecond.getValue() - first.getValue(); \t \t \t \t} \t \t \t}); – bocante

答えて

1

には、いくつかのアルゴリズムがそれ

を解決するためにありますが、私は最も簡単な方法は、データベースを使用していると思います。

データベース心配展開に大きなハードであれば、あなたは、すべてのMySQL /オラクル/ SQLサーバ/ postgresのに値...と

select xxxx from xxx order by xxx 

を挿入することができますが、sqlite

の試してみます
+0

これはコンソールアプリケーションです。私はデータベースを使用すべきではないと思っています。 – bocante

+0

データベースをデータベースとみなさないでください。 **外部ソートアルゴリズム**のライブラリは、SQLインタフェース内にあります。 **外部ソートアルゴリズム**はちょうどあなたが必要とするものです:-) –

関連する問題