【问题标题】:Smallest (in size) object to hold unique number?保存唯一编号的最小(大小)对象?
【发布时间】:2015-10-21 19:16:53
【问题描述】:

我有很多计算机并且需要具有唯一 ID 的情况。

他们会通过 API 请求发送他们的 uniqueId。对象看起来像

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 范围

我有什么选择?

【问题讨论】:

  • 您是否考虑过让每个客户端通过UUID.randomUUID() 为每个请求生成一个 16 字节的 GUID?并且可能将这 16 个字节作为 2 个长字节保存在现有对象中?
  • 为什么不只用timestamp作为id,什么时候实例化一个新对象,可能不太可能有重复的timestamp

标签: java memory uuid


【解决方案1】:

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

所以我假设你有一些限制你的 RAM 的情况。

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

如果这不可能,我建议用时间戳数组替换链接的对象列表。只是时间戳。然后你用 ID 号索引到数组中。当然,这假定 ID 号从 0 开始并达到数百万。如果它们随机分布在 32 位整数的域中,那么这是行不通的。

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

如果您要添加和删除项目,那么您可能希望保留用于跟踪活动元素总数的变量。

【讨论】:

  • 使用并行原语数组,您将如何支持删除已完成请求的 ID?您是否假设所有请求都快速完成,以允许使用循环队列?
  • 我认为我的文本中有剪切/粘贴错误。我会尝试修复它。我不是在建议并行数组。我的意思是你有一组时间戳。然后你用 4 字节的 ID 号索引到那个数组。如果 ID 号是连续的(从零开始),则 ID 号和数组索引之间存在一对一的对应关系。如果你需要删除一个ID,那么你可以在时间变量中存储'0'来表示一个死元素。
  • 这似乎假设每台计算机最多有一个并发请求。
  • 是的,我做出了这样的假设。如果您另有说明,我深表歉意。如果不是这样,数组的想法将不起作用。
【解决方案2】:

正如您所说,您只需要 数百万个这样的对象。因此,在 int 中,您仍然有 数千 这些数百万。

所以,我会选择 int,由 MACHINE ID + NUMBER 组成。

如果您有 1000 台机器,您将有大约 200 万个数字,但我想您的数量较小,所以例如即使有 100 台机器,您仍然有 2000 万个可能的数字...

此外,您可以通过增量生成这些数字,无需随机化 - 因为每台机器都有自己的范围。

0 - 20 000 000: Machine 1 scope
21 000 000 - 40 000 000: Machine 2 scope
....
1 000 000 000 - 1 020 000 000: Machine ~100 scope

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

【讨论】:

  • int是机器id,时间戳会很长,如果基于id:timestamp则唯一性
  • 你真的需要时间戳吗?
  • 通常,时间戳用于调度。这只是一个猜测,但我认为这就是 OP 使用它的目的。
  • 是的,timestamp是必需的,因为在服务器上,我需要根据timestamp从各个节点订购请求
  • 也许您可以将时间戳绝对值减少到不太重要的 32 位?因此,每个请求最终得到 2x int。
猜你喜欢
  • 1970-01-01
  • 2016-09-17
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 2011-10-21
  • 2013-08-30
  • 1970-01-01
  • 2013-09-26
相关资源
最近更新 更多