1

キー、value1(float)、および value2 (非常に長い文字列) をマップに格納する必要があるという問題があります。value1 はすべてのキーで使用でき、value2 はキーの 1% でしか使用できません。

私は2つの可能な解決策を考えることができます

  1. map1 = map(key1 ,map(key2, value1)) と map2 = map(key1, map(key2,value2)) のような 2 つのマップの長所 - 不要な参照変数はありません。短所 - 同じキーを2回保存すると、メモリが無駄になります。

  2. カスタム オブジェクト値を持つ 1 つのマップを使用します。map1 = マップ customobj{float value1; string value2} 長所 - キーの重複はありません。cons- customobj の 99% は value2=null を持つため、参照ポインタのためにメモリを消費します。

基本的に私の最終的な質問は、未使用の参照 (customobj 内) がメモリを消費するのか、それともコンパイラが最適化するのかということです。同じkey1とkey2を2回保存してメモリを無駄にしたくないので、soln 2に傾いています。一方、value2=null の時間の 99% は、soln1 が優れているかどうか疑問に思います。

私はJavaを使用していますが、アドバイスを聞きたいです。

編集:私が投稿したマップ構造をSOが印刷しなかったことに気づかなかったので、編集しました。key1 と key2 の両方が文字列です (ほとんどの場合、固定長の ID 文字列)

4

2 に答える 2

2

キーのサイズとタイプに応じてソリューションを選択します

解決策 1 は --

1) キーと値を持つ HashMap1(float)

2) キーと value2(文字列) を持つ HashMap

これは、キーの 1% に対して余分なスペースを必要とするだけです。キーのサイズが大きい場合は、ソリューション 2 を使用します。

解決策 2 は --

カスタム オブジェクトを含む単一の HashMap。構造体またはクラスを使用してカスタム オブジェクトを作成します。

参照のメモリは非常に小さいですが、各オブジェクトはオブジェクト オーバーヘッド (16 バイト) とパディング (4 バイト) の一定のメモリを占有します。ソリューション 1 の HashMap キーは、キーと値のペアごとに約 8 バイトのオーバーヘッドを占める可能性があります。したがって、鍵のサイズが整数または文字よりも大きい場合は、解決策 2 を選択してください。

于 2013-10-04T18:38:21.977 に答える
0

解決策 3. 値が Float または CustomObj{float value1; 文字列値2}。実行時に instanceof を実行して、どれがどれであるかを調べます。

それは、最適化が問題でさえあると仮定します。時期尚早の最適化は諸悪の根源ですよね?まだ最適化する必要があるかどうかわからない場合は、モデリングしている現実世界を概念化する方法でコーディングしてください。

于 2013-10-04T18:58:56.020 に答える