4

私はかなり大きなグーグルを持っていてMultimap<String,String>、メモリ使用量を減らす方法を探していました。すべての例で、人々が次のようなことをしていることがわかります。

Multimaps.newSetMultimap(
TDecorators.wrap(new TIntObjectHashMap<Collection<Integer>>()),
new Supplier<Set<Integer>>() {
public Set<Integer> get() {
  return TDecorators.wrap(new TIntHashSet());
}
});

で動作しMultimap <Integer,Integer>ますが、Trove を使用して をラップすることは可能<String,String>ですか?

誰かが将来に興味を持っている場合に備えて、 http://code.google.com/p/jdbm2/を使用 して、ハッシュ マップをファイル システムに書き込みました。

4

4 に答える 4

6

Guava のマルチマップは、メモリ使用量が最適化されていない標準の JDK コレクションによってサポートされています。たとえば、ArrayListMultimap<K, V>によって支持されHashMap<K, ArrayList<V>>HashMultimap<K, V>によって支持されていHashMap<K, HashSet<V>>ます。

Eclipse Collections (以前のGS Collections ) には、独自のコンテナー タイプUnifiedMapUnifiedSet. UnifiedMapは の半分のメモリをHashMap使用UnifiedSetし、 の 4 分の 1 のメモリを使用しますHashSetFastListMultimap表示されるメモリの利点は、 を使用するか を使用するかによって異なりますUnifiedSetMultimap

より詳細なメモリ比較については、こちらをご覧ください

注:私は Eclipse コレクションのコミッターです。

于 2013-09-03T17:00:44.260 に答える
3

次のようなハッシュマップのメモリ効率の高いバリアントを見ることができます: https://code.google.com/p/sparsehash/

値の文字列が十分に長い場合は、圧縮がオプションになる可能性があります。アクセス統計に応じて、Ehcache などのディスク バックアップ ソリューションを調べることもできます。

于 2013-03-22T20:38:11.567 に答える
0

私が使用するアプローチはMap<String,Collection<String>>、値がどこから始まるかを使用し、バケツがあるしきい値 (たとえば 32 要素) に達したときにArrayList<String>昇格するというものです。HashSet<String>

これにより、小さなバケットのメモリが大幅に節約されることがわかりました。

于 2013-06-26T11:23:41.287 に答える
0

Trove4j には、文字列から文字列へのハッシュマップが含まれていません。

http://trove4j.sourceforge.net/javadocs/gnu/trove/map/hash/package-summary.htmlを参照してください。

于 2013-03-22T20:27:48.320 に答える