保持唯一编号的最小(大小)对象?
Smallest (in size) object to hold unique number?
我的情况是我有很多电脑,需要有唯一的 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
范围
我有哪些选择?
如您所说,您只需要 数百万个这样的对象。所以,在 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 是面向对象的,您仍然可以制作一个 "optimized storage",它将 all/grop 你的值保存在一个数组中(甚至可能按时间戳分组,所以你可能有 10000 个整数的数组,有 1000 个相应的时间戳等
即使您的对象总共占用 24 个字节。即使你有 10 的数百万也只有 240 MB。可以肯定的是,这是一个很大的数字,但与大多数现代 PC 的尺寸相比还是很小的。
所以我假设您遇到了一些限制您的 RAM 的情况。
假设您有数百万个这样的对象。大概它们将存储在硬盘上。否则,当电源出现故障时,您将丢失数百万个参考资料。如果您不需要经常迭代列表,您可以将它们存储在 HDD 上以释放 RAM。
如果那不可能,我建议用时间戳数组替换对象的链接列表。只是时间戳。然后你用 ID 号索引到数组中。当然,这假定 ID 号从 0 开始到数百万。如果它们随机分布在 32 位整数的域中,那么这将不起作用。
现在每个条目只需要 8 个字节。如果您需要查找特定时间戳对应的 ID,则需要搜索整个数组以查找该时间戳。如果您需要搜索特定 ID 的时间戳,则只需索引该数组即可。 return timstamps[index];
如果您要添加和删除项目,那么您可能希望保留跟踪活动元素总数的变量。
我的情况是我有很多电脑,需要有唯一的 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
范围
我有哪些选择?
如您所说,您只需要 数百万个这样的对象。所以,在 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 是面向对象的,您仍然可以制作一个 "optimized storage",它将 all/grop 你的值保存在一个数组中(甚至可能按时间戳分组,所以你可能有 10000 个整数的数组,有 1000 个相应的时间戳等
即使您的对象总共占用 24 个字节。即使你有 10 的数百万也只有 240 MB。可以肯定的是,这是一个很大的数字,但与大多数现代 PC 的尺寸相比还是很小的。
所以我假设您遇到了一些限制您的 RAM 的情况。
假设您有数百万个这样的对象。大概它们将存储在硬盘上。否则,当电源出现故障时,您将丢失数百万个参考资料。如果您不需要经常迭代列表,您可以将它们存储在 HDD 上以释放 RAM。
如果那不可能,我建议用时间戳数组替换对象的链接列表。只是时间戳。然后你用 ID 号索引到数组中。当然,这假定 ID 号从 0 开始到数百万。如果它们随机分布在 32 位整数的域中,那么这将不起作用。
现在每个条目只需要 8 个字节。如果您需要查找特定时间戳对应的 ID,则需要搜索整个数组以查找该时间戳。如果您需要搜索特定 ID 的时间戳,则只需索引该数组即可。 return timstamps[index];
如果您要添加和删除项目,那么您可能希望保留跟踪活动元素总数的变量。