2017-03-27 15 views
4

HashMap<Integer, SomeType>()を100万を超えるエントリで使用しています。私はそれが大きいと考えています。メモリ使用量を改善しました。IntegerHashMap

しかし、整数は独自のハッシュコードです。 Integerオブジェクトへのポインタの代わりにintを直接使用して、特別なMap.Entryを使用するメモリ、たとえばIntegerHashMap<Integer, SomeType>()を保存できませんでしたか?私たちの場合、これはIntegerオブジェクトに必要なメモリを1000000x節約します。

私の考えの欠陥はありますか?一般的に興味があるのはあまりにも特別ですか? (少なくとも、EnumHashMapがあります)

add1です。 IntegerHashMapという第1の汎用パラメータは、他のMapの実装とよく似ています。もちろん、それは落とすことができます。

add2。他の地図やコレクションでも同じことが可能です。たとえば、注意のToIntegerHashMap<KeyType, Integer>IntegerHashSet<Integer>など

答えて

2

あなたが探しているのは、「プリミティブコレクション」ライブラリです。通常、メモリの使用量とパフォーマンスがはるかに優れています。最も古く/人気のある図書館の1つが「Trove」と呼ばれていました。しかし、今は少し時代遅れです。使用中の主な活性ライブラリは次のようになります。に応じて

See Benchmarks Here

+0

JDK/Apacheコモンズの一部としてのプリミティブコレクションの(任意の)実装/グワバ。残念ながら、追加ライブラリを使用することは容易ではありません。スピードは私の心配ではなく、記憶です。それにもかかわらず、あなたの答えはおそらく私が得ることができるほど近いです。 –

1

いくつかの単語:

  1. 私はこの声明で非常に慎重になるだろう「整数は、独自のハッシュコードです」。あなたが持っている整数に応じて、キーの分布は最適からひどいものまでです。理想的には、私はあなたがカスタムIntFunctionをハッシュ戦略として渡すことができるようにマップを設計します。必要に応じてこれをデフォルトの(i) -> iに設定することはできますが、モジュロファクタを導入することもできます。そうしないと、内部配列が膨大になります。 IntBinaryOperatorを使用することもできます.1つのパラメータがintで、もう1つがバケットの数です。

  2. 私は最初のジェネリックパラメータを削除します。 Map<Integer, SomeType>を実装したくないのはおそらく、すべてのメソッドでbox/unboxする必要があり、すべての最適化(スペースを除く)が失われるためです。オブジェクトコレクションと互換性のあるプリミティブコレクションを作成しようとすると、全体の運動は無意味になります。

+1

良い点声明 "の整数、独自のハッシュコードです"。簡単にするために、私は整数のための適切なハッシュ法を構築します。しかし、あなたは秘密の 'Map.Key'オブジェクトを使用するので、それも実行できます。 –

+0

@UlrichScholz私は、オブジェクト全体を可能な限り避けることがポイントだと思っていました。しかし、それはあなたのユースケースが何であるかによって異なります。 –

+0

もちろん、不要なオブジェクトは避けたいです。できるだけそれらを避けることは別のことです。 私は現在の 'HashMap'実装の詳細に慣れていません。しかし、適切なハッシュ関数とともに 'int'キーを使用することを除いて、' IntegerHashMap'をそれに厳密に従わせることは可能であるべきです。 (おそらく 'Integer'で実装されたものと同じです)。 –

関連する問題