を使用して、大量の JavaUUID
をHashMap
as 行に格納していUUID.toString()
ます。データが大きいので、すぐに をスローしOutOfMemoryError
ます。今、私は を表現するコンパクトな方法UUID
、できれば のようなものを考えています。long
その後、UUID
そのlong
表現で を簡単に再構築できます。これは可能ですか?
2 に答える
を使用して、大量の Java
UUID
をHashMap
as 行に格納してい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 個を超えるオブジェクトがあると思われます。int
HashMap
Integer.MAX_VALUE
HashMap<UUID, MyObject>
HashMap<Integer, MyObject>
Short
OutOfMemoryError
最後に、他のすべてが失敗した場合は、この質問で示されているように、JVM により多くのメモリを割り当てます。
UUID は基本的に数値ですが、これは 128 ビットの数値であり、Java long の 2 倍のサイズです。BigInteger を使用することもできます (これは、UUID を文字列として保存するよりもスペース効率が良くない可能性があります)。または、最初の 64 ビット用と最後の 64 ビット用の 2 つの long を含むオブジェクトに UUID をカプセル化することもできます。
UUID が与えられた場合、1 つは number を含み、もう 1つ550e8400-e29b-41d4-a716-446655440000
は number を含む 2 つの long を作成する必要があります。0x550e8400e29b41d4
0xa716446655440000