4

Map次の宣言のようなインターフェイスを使用して、ツリーのような構造を実装しています。

Map<String, Map<String, Map<Integer, Double>>>

現在、私はHashMap実装を使用しています。大量のデータをロードした後、プログラムが 4GB の RAM を消費していることがわかります。インターフェイスを使用してエンティティ全体を永続化するSerializableと、結果のファイルのサイズはわずか 1 GB になります。

ここで使用できる最もメモリ効率の高いMap実装は何ですか?

4

2 に答える 2

4

(String、String、Integer)をFloatにマップする場合、最善の方法は、を使用することですMap<MyKey, Float>。ここで、MyKey次のように定義されます。

public final class MyKey {
    private final String a;
    private final String b;
    private final Integer c;

    public MyKey(String a, String b, Integer c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    // getters, if needed

    @Override
    public int hashCode() {
        return Objects.hash(a, b, c);
    }

    @Override
    public boolean equals(Object o) {
        if (o == this) {
            return true;
        }
        if (!(o instanceof MyKey)) {
            return false;
        }
        MyKey other = (MyKey) o;
        return Objects.equal(a, o.a)
               && Objects.equal(b, o.b)
               && Objects.equal(c, o.c);
    }
}
于 2012-11-25T16:13:25.533 に答える
3

ここには 2 種類のマップがあります。String キーと Map 値を持つもの。そのために、不変性が問題ない場合は、おそらくGoogle Guava の ImmutableMapを使用します。おそらく多くのメモリを節約するわけではありませんが、いくらかは節約でき、通常の HashMap よりもパフォーマンスが向上する可能性があります。

Integer キーと Double 値を持つ他の Map については、オブジェクトの代わりにプリミティブを格納する特別な Map 実装を使用する必要があります。たとえば、Trove4j の TIntDoubleHashMapを見てください。プリミティブはオブジェクトではなくプリミティブとして格納されるため、これにより多くのメモリが節約されます。

于 2012-11-25T14:32:38.183 に答える