2

私はOOMを使い続けるサーバーをメモリ最適化しようとしています。私の目的に役立つ最もメモリを節約するデータ構造は何ですか?

サーバーで(数による)オブジェクトのほとんどは、以下の形式をとる:

  • 各オブジェクトは
  • HashMapのキーが
  • HashMapの値は、どの属性クラスのオブジェクトである文字列でのHashMapでありますちょうど整数と2ブール値を持っています。

重要:このようなハッシュマップの95%には1つのキーしかありません。それがハッシュマップを作成するときに当てはまるかどうかは分かります。

これらのハッシュマップは何百万もあります。

これらのハッシュマップを最適化するという別の質問がありました。コメントの誰かが、最初のサイズが「1」のHashMapsがまだ余分なメモリを占めているので、 。

このように、私の質問は、より良いメモリ効率で同じ正確なデータを格納できる、より優れたJavaデータ構造が実装できますか?

注:特定の値がキーとして存在するかどうかを調べることができる必要があります。私は考慮しましたが、[string_value、int、boolean、boolean]の5つのリストにデータを格納することを拒否しました。

+0

は、マップのキーは変更できますか? –

+0

@JohnKugelman - no。値の属性オブジェクトは時々変更できますが、キーは変更されません – DVK

+0

最初の欲求を持つ人は、singletonMapについて言及しました。それは良い答えだと私は実際に提供する手がかりを持っている人に感謝する "これは、通常のHashMapがどれくらいのメモリを要しているか、これはsingletonMapがどれくらいかかります" – DVK

答えて

1

各オブジェクトはHashMapですか?非常に良い抽象ではありません。私はコンポジションが好きです:HAS-A HashMapオブジェクトを作成し、明確なAPIを提供します。それをComparableにし、hashCodeとequalsを実装します。

それらの多くが繰り返されると、あなたはフライウェイトパターンに従うことをお勧めします。

オブジェクトが不変で読み込み専用の場合、これは完全に最適化されます。

インスタンスを作成し、一意のリストを保持するFactoryオブジェクトがあります。 List内にすでに存在するものを求める人がいる場合は、不変のコピーを返します。

実装する前にどれくらいのメモリを節約できるかを計算できます。

+0

問題は、ほとんどのメモリを節約する構造体でした。 "あなたが計算することができます"それはさらに悪いメモリパフォーマンスがあるかもしれないことを示すようです。 – DVK

+0

「計算できます」と言うと、今日のデータを見て、「メモリ内のオブジェクトを複製することなく、どれだけ多くのFlyweight不変インスタンスを渡すことができるのですか」と答えることができます。鍵は不変のデータであり、多くのリピートです。これらの仮定が両方とも真実なら、あなたが私の提案に従えば、多くのメモリを節約できます。 – duffymo

+0

OK、よく私と同じように、私は名前パターンを使用していることを知るのに十分スマートではないパターンビットを使用するのに十分なスマートです:)あなたが投稿した時刻の周りに私の属性のためにFlyweightのことを行いました答え、ちょうどそれがそれだったことを気づかなかった。それはいくつかのメモリを保存しましたが、明らかに十分ではありません。私はHAS-Aハッシュマップの意味を理解していませんか?あなたは1つのメンバとして1つの値を格納し、別のメンバとしてhashmap(1つの値の場合はnull)を格納することを意味しますか? – DVK

2

HashMapではなく、より具体的でないMapインターフェイスをユーザーに公開します。これにより、ケースに応じてハッシュマップまたはシングルトンマップを自由に使用できます。

メモリ効率的なシングルトンのマップはCollections.singletonMap()を介して作成することができます。http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collections.java#Collections.SingletonMap

P.S.:https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#singletonMap(K,%20V)

SingletonMapは、ちょうど2つのフィールドを持つオブジェクトと、いくつかのキャッシュとして実装されているように見えます

public final class SingletonAttributeMap extends Attribute implements Map<String,Attribute> { 

    private final String key; 

    public Attribute get(String key) { 
    return this.key.equals(key) ? this : null; 
    } 

    .... 
} 

p.p.s属性の整数値の最大サイズがあります:あなたは、このような単一のインスタンスにマップし、値を崩壊することによって、あなたの特別な場合のために、よりコンパクトな何かを持っているだろうか?あなたは(これは実際にメモリがWhat is the memory consumption of an object in Java?を参照して、パディング/アライメントに依存します保存するかどうか)は、このようなトリックを行うことができるかもしれない:マップが作成された後

class Attribute { 
    private int value; 

    boolean getBoolean1() { 
     return (value & 1) != 0; 
    } 

    boolean getBoolean2() { 
     return (value & 2) != 0; 
    } 

    int getInt() { 
     return value >> 2; 
    } 

    void setBoolean1(boolean b) { 
     value = (value & ~1) | (b ? 1 : 0); 
    } 

    void setInt(int i) { 
     value = (value & ~3) | (i << 2); 
    } 

    ... 
関連する問題