3

私は現在、数十億のエントリを持つデータベースを中心に展開するプロジェクトの小さなフレームワークを意図したコードを Java で書いています。私はそれを高レベルに保ちたいと思っており、データベースから取得したデータを統計的推論に簡単に使用できるようにする必要があります。このプロジェクトでは Map インターフェイスを使用することにしました。

核となる概念は、読み取り可能なコードのために単一のデータセット (データベース内の列を意味します) を処理するときに、属性 (「データベース内の列」) を値 (「セル」) にマッピングすることです: 私は列挙型オブジェクト (「属性」という名前) を使用します。 ) 属性タイプの場合、これは mapping を意味します。これは<Attribute, String>、データ要素がすべて文字列 (あまり大きくなく、最大 40 文字程度) であるためです。15 の列があるため、15 の列挙型があり、マップには非常に多くのエントリしかありません。

そのため、非常に多数の Map オブジェクトが時々浮かんでいるように見えますが、ペイロードは比較的わずかです (15-)。私の目標は、実際のペイロードと比較して、実装メモリのオーバーヘッドが原因でメモリが爆発しないようにすることです。(目標を伸ばす: CPU 使用率についても同じことを行います ;] )

私はこれまで Java Collections のさまざまな実装すべてに精通していたわけではありませんでした。今日問題が発生したとき、私はこれまでずっとお気に入りだった 'HashMap' を調べましたが、そこにあるメモリ オーバーヘッドの量に満足していませんでした。宣言されました。標準の実装に加えて、Java に同梱されていない実装が多数あることは確かです。私のケースをグーグルで検索しても、あまり結果が得られませんでした。

私のユースケース (エントリ数が少ない、値のサイズが小さい、列挙可能なキーなど) の Map の適切な実装を知っていますか?

ユースケースを明確にしたことを願っています。また、ご意見をお待ちしております =) どうもありがとうございました!


絶対にオプションで、時間と知識がある場合にのみ、答えの目標を広げてください: コレクションの他のどのような実装が適していますか:

  • 属性(文字列のもの)ベクトル、および推論データの行列(カウント/確率)の処理(行列:ここでは、今のところ本当に無知です。これまで、Javaで深刻な数学の作業は本当にありませんでした)
  • 統計的推論のための数学ライブラリ、上記を参照
4

3 に答える 3

7

を使用EnumMapします。これは、パフォーマンスとメモリ使用量の両方で、キーとして列挙型がある場合に最適なマップ実装です。

秘訣は、このマップの実装がキーを格納しない唯一のものであり、値を持つ単一の配列のみが必要であるということです (値の に似てArrayListいます)。値にマッピングされていないキーがある場合、オーバーヘッドはわずかですが、列挙型には通常あまり多くのインスタンスがないため、ほとんどの場合、これは問題になりません。

と比較してHashMap、予測可能な反復順序を無料で取得できます。

于 2013-05-17T17:20:15.747 に答える
3

2 つの配列リスト (キーと値) を使用する単純なマップ実装を使用して、メモリを少し絞り出すことができます。より大きなマップの場合、リスト全体をスキャンする必要があるため、挿入と検索の速度が大幅に遅くなります。ただし、小さなマップの場合、ハッシュコードを計算する必要がなく、少数のエントリのみを確認する必要があるため、この方法の方が実際には高速です。

実装が必要な場合は、jsonj プロジェクトの SimpleMap をご覧ください: https://github.com/jillesvangurp/jsonj/blob/master/src/main/java/com/github/jsonj/SimpleMap.java

于 2013-05-17T13:00:09.913 に答える