Forums: Open Discussion (Thread #17771)

コレクション、マップ実装について (2008-02-20 17:23 by Anonymous #35178)

機能追加要望ばかりで済みません。システム企画Mです。

昨今のJavaEE環境ではパフォーマンス要件などで
大量のデータをメモリ管理しなければならない場合も多々あるかと思われます。

現在携わっている某プロジェクトもAPのステータス情報等をHashMapで管理していますが
HashMapにいくつか不満を持っています。

・内部管理しているEntry数が閾値を超えた場合の
 配列サイズ拡張 が何時発生しているのかわからない。(ログ出力されない。)
・ハッシュの衝突、同一配列インデックス保存が
 何時発生しているのかわからない。(ログ出力されない。)
 Entry.next階層が深くなっていると非効率的と思われる。
・ハッシュの衝突、同一配列インデックス選択が発生しにくいアルゴリズムなのか?

全体的にHashMap内で何が起きているか、
どのように保持、管理されているか

ということがモニタリングできないので不便です。

下記のようなMap実装を作成検討願えないでしょうか?

・イベントのログ出力(配列拡張、ハッシュ衝突、その他アルゴリズムによる。)
・レポート、アドバイス機能。もしくはAI自動調整機能。
・高度なハッシュ関数アルゴリズム。とにかく隔たる。衝突しにくい。
・ハッシュ関数アルゴリズム変更可能。

Reply to #35178×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: コレクション、マップ実装について (2008-02-27 12:21 by yggd #35302)

まず、ハッシュ衝突や配列拡張のモニタを行うことで、少なからず Map の性能は低下するものと考えます。

一方でハッシュ衝突が必ずしも性能劣化のボトルネックとなりえないケースもあります。
ハッシュ関数のみならず、ハッシュテーブル領域作成のメモリアロケートと
rehash にかかるコストについても考慮が必要となります。
(HashMap.Entryの初期サイズは、コンストラクタで指定可能な初期容量 * 負荷係数
のバイトサイズ配列として確保されます。)

そのため、以下の2点につきましては何をもって最適解とするかで、
Map の実装は大きく異なってくるものと考えます。

1. ハッシュ関数の算出
2. ハッシュテーブルの管理

Java SE APIでも、ConcurrentHashMap や、LinkedHashMap、
IdentityHashMap などの Map 実装が複数用意されており、機能として
重視したいものに応じて利用するのが一般的と考えます。

一方で、内部のモニタリングにつきましては Bug Database でも RFE が提出されています。

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6654502


HashMap を用いたハッシュ値算出の検証については、Object#hashCode()
が利用されるため、Map内のエントリとなりうるオブジェクトに対して
このメソッドをオーバライドすることで、
必要に応じて衝突しづらくしたり、HashMap のソースコードから実際の
ハッシュ値をモニタすることは可能であると考えます。

参考:
http://www.asp-edita.jp/doda/one/doda7204_118.html

# 一方で Java SE 6 現在、上記記事によると、Object#hashCode() を
# 常に1とすることで内部ハッシュ値も1となり、
# 必ず衝突が発生するため、これを用いた性能比較も可能だと考えます。
Reply to #35178

Reply to #35302×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login