5

を使用して、大量の JavaUUIDHashMapas 行に格納していUUID.toString()ます。データが大きいので、すぐに をスローしOutOfMemoryErrorます。今、私は を表現するコンパクトな方法UUID、できれば のようなものを考えています。longその後、UUIDそのlong表現で を簡単に再構築できます。これは可能ですか?

4

2 に答える 2

8

を使用して、大量の JavaUUIDHashMapas 行に格納していUUID.toString()ます。

つまり、これはどういう意味HashMap<String, MyObject>ですか?

経由で UUID 自体をHashMap<UUID, MyObject>保存すると、 に比べてスペースが節約されHashMap<String, MyObject>ます。AUUIDは、よりも少ないスペースを占有しますString(2 つのlong値が 16 バイトになるchar[36]のに対し、72 バイトの場合、ほぼ 80% のスペースを節約できます)。

UUID変更しても十分でない場合は、値が JVM 全体で重要かどうかを検討してください。ID が 1 つのプロセスに対してのみ一意である必要がある場合 (をディスクに保存するか、 Java プロセス間でHashMap共有するか)、aをこれ以上大きくすることはできないため、そのまま使用できます。の代わりに、 があります。さらに良いことに、オブジェクトが 2 16個未満の場合に使用でき、さらに多くのスペースを節約できます。ただし、 を取得している場合は、おそらく 65536 個を超えるオブジェクトがあると思われます。intHashMapInteger.MAX_VALUEHashMap<UUID, MyObject>HashMap<Integer, MyObject>ShortOutOfMemoryError

最後に、他のすべてが失敗した場合は、この質問で示されているように、JVM により多くのメモリを割り当てます。

于 2013-01-14T18:12:19.477 に答える
8

UUID は基本的に数値ですが、これは 128 ビットの数値であり、Java long の 2 倍のサイズです。BigInteger を使用することもできます (これは、UUID を文字列として保存するよりもスペース効率が良くない可能性があります)。または、最初の 64 ビット用と最後の 64 ビット用の 2 つの long を含むオブジェクトに UUID をカプセル化することもできます。

UUID が与えられた場合、1 つは number を含み、もう 1つ550e8400-e29b-41d4-a716-446655440000は number を含む 2 つの long を作成する必要があります。0x550e8400e29b41d40xa716446655440000

于 2013-01-14T17:45:57.610 に答える