保留唯一编号的最小(大小)对象?

时间:2015-10-21 19:16:53

标签: java memory uuid

我的情况是我有很多电脑,需要有唯一的ID。

他们会发送带有API请求的uniqueIds。该对象看起来像

class ID {
 long timestamp;
 int id;
}

此对象的最小尺寸为24 bytes (8 byte long, 4 byte int, 8 byte object reference and 4 byte padding)。我需要将数百万个这些对象保存在内存中,这就是内存受到关注的原因。我需要timestamp进行订购。

我最初认为每个节点在启动时都会有UUID(作为唯一字符串。由于UUID需要128 bits,因此它不适合Int范围

我有什么选择?

2 个答案:

答案 0 :(得分:0)

正如您所说,您需要数百万这些对象。所以,在@player.position中,你仍然有数千的那些人。

所以,我只会使用由int + MACHINE ID组成的int。

如果你有1000台机器,你将有大约2百万的数字,但我想你的数量较少,所以例如即使有100台机器,你仍然有20亿可能的数字......

另外,这些数字你可以通过增量生成,而不是随机化 - 因为每台机器都有它自己的范围。

NUMBER

另外,不要包含填充或引用等内容 - 即使您的API是面向对象的,您仍然可以创建一个“优化存储”,它将保存您的所有/ grop值在一个数组中(甚至可能是由时间戳组成的,所以你可以拥有10000个整数的数组,1000个相应的时间戳等。

答案 1 :(得分:0)

即使您的对象总共占用24个字节。即使你拥有数百万的数百万,也只有240 MB。可以肯定的是一个很大的数字,但与大多数现代PC的尺寸相比很小。

所以我认为你有一些限制你的RAM的情况。

因此,假设您有数百万这些对象。据推测,它们将存储在硬盘上。否则当电源出现故障时,您将丢失数百万个引用。如果您不需要经常迭代列表,则可以将它们存储在HDD上以释放RAM。

如果无法做到这一点,请允许我建议用TimeStamps数组替换对象的链接列表。只是时间戳。然后,您将使用ID号索引到数组中。当然,这假设ID号从0开始并进入数百万。如果它们随机分布在32位整数域中,那么这将不起作用。

现在每个条目只需要8个字节。如果您需要查找具有特定时间戳的ID,那么您需要搜索整个阵列以查找该时间戳。如果您需要搜索特定ID的时间戳,那么您只需索引该数组。 return timstamps[index];

如果要添加和删除项目,则可能需要保留跟踪活动元素总数的变量。