Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 保存唯一编号的最小(大小)对象?_Java_Memory_Uuid - Fatal编程技术网

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

Java 保存唯一编号的最小(大小)对象?,java,memory,uuid,Java,Memory,Uuid,我有一个情况,我有很多电脑,需要有唯一的ID 他们将发送带有API请求的唯一ID。这个物体看起来像 class ID { long timestamp; int id; } 此对象可能的最小大小为24字节(8字节长、4字节整数、8字节对象引用和4字节填充)。我需要在内存中保存数百万个这样的对象,这就是为什么内存很重要。我需要时间戳,以便订购 我最初认为,每个节点在启动时都会有UUID(作为唯一的字符串)。因为UUID需要128位,所以它不能适应Int范围 我的选择是什么?正如你所说,你只需

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

他们将发送带有API请求的唯一ID。这个物体看起来像

class ID {
 long timestamp;
 int id;
}
此对象可能的最小大小为
24字节(8字节长、4字节整数、8字节对象引用和4字节填充)
。我需要在内存中保存数百万个这样的对象,这就是为什么内存很重要。我需要
时间戳
,以便订购

我最初认为,每个节点在启动时都会有
UUID
(作为唯一的字符串)。因为
UUID
需要
128位
,所以它不能适应
Int
范围


我的选择是什么?

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

因此,我将使用int,由
机器ID
+
数字
组成

如果你有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是面向对象的,您仍然可以制作一个“优化存储”,它将在一个数组中保存所有/grop值(甚至可以按时间戳排序,这样就可以有10000个整数的数组,以及1000个相应的时间戳等。

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

因此,我将使用int,由
机器ID
+
数字
组成

如果你有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是面向对象的,您仍然可以制作一个“优化存储”,它将在一个数组中保存所有/grop值(甚至可能是按时间戳排序的,因此您可以有10000个整数的数组,以及1000个相应的时间戳等。

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

所以我假设你有一些情况限制了你的内存

假设你有数百万个这样的对象。它们可能会存储在硬盘上。否则,当电源故障时,你会丢失数百万个引用。如果你不需要经常迭代列表,你可以将它们存储在硬盘上以释放RAM

如果这是不可能的,我建议用一个时间戳数组替换对象的链表。只是时间戳。然后用ID号索引到数组中。当然,这假设ID号从0开始,以百万计。如果它们随机分布在32位整数的域中,那么这不会发生工作

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


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

即使对象的总字节数为24字节。即使对象的总字节数为10百万,也只有240 MB。这的确是一个很大的数字,但与大多数现代PC的大小相比还是很小的

所以我假设你有一些情况限制了你的内存

假设你有数百万个这样的对象。它们可能会存储在硬盘上。否则,当电源故障时,你会丢失数百万个引用。如果你不需要经常迭代列表,你可以将它们存储在硬盘上以释放RAM

如果这是不可能的,我建议用一个时间戳数组替换对象的链表。只是时间戳。然后用ID号索引到数组中。当然,这假设ID号从0开始,以百万计。如果它们随机分布在32位整数的域中,那么这不会发生工作

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


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

int
用于机器id,时间戳将很长,唯一性如果基于
id:timestamp
您真的需要时间戳吗?通常,时间戳用于调度。这只是一个猜测,但我不知道ink这就是OP使用它的目的。是的,
timestamp
是必需的,因为在服务器上,我需要根据
timestamp
对来自各个节点的请求进行排序,也许您可以将时间戳绝对值减少到不太重要的32位?因此,每个请求都有2x int。
int
用于机器id,时间戳将是长,唯一性如果基于
id:timestamp
你真的需要时间戳吗?通常,时间戳用于调度。这只是猜测,但是