Vertx:将初始数据传递给部署的 Verticle
Vertx: pass initial data to verticle on it deployment
如何将 int[][]
数组的副本传递到其部署的 Verticle?
我有一个 ServerVerticle
,可以从中部署 5-10 ServiceVerticle
。
每个 ServiceVerticle
必须使用相同的共享数据结构 - Map<Integer, Short[]>
可以是 100-2000 Mb。
问题 - 我无法创建 Local
以数组作为值的地图。
我看到的唯一内存中解决方案 - 将 int[][]
的副本传递给部署上的每个 ServiceVerticle
,并保留 5-10 个数据副本。
P.S。这个数据结构必须尽可能快地查找,所以我不喜欢像 Hazelcast 这样的集群范围的解决方案 IMap
.
虽然您可以在 LocalMap
中使用的类型没有太多自由,但您可以使用 Buffer
。缓冲区是经过优化的字节数组,您可以快速调整它以适应您的用例。使用 Buffer
还意味着您将拥有紧凑的内存表示,因此您可以节省内存并且任何操作都会很快。
你只需要写一个从二维平面到一维线的转换。例如假设您有以下数组 (2 x 3):
int[][] data = new int[] {
new int[] {1, 2, 3},
new int[] {4, 5, 6},
};
如果将其转换为缓冲区:
Buffer.buffer()
.appendInt(1).appendInt(2).appendInt(3)
.appendInt(4).appendInt(5).appendInt(6);
(您以后可以只使用字节表示,这只是为了说明它是如何工作的)。
现在您可以通过以下方式引用任何 x
、y
:
int getInt(int x, int y) {
// transform from 2D to 1D
int pos = y * LENGTH + x;
// Where LENGTH is the the example: 3
// For safety assert on length
if (pos > buffer.length()) throw new ArrayIndexOutOfBoundsException();
// TODO: assert on min, max (x, y)
return buffer.getInt(pos);
}
如何将 int[][]
数组的副本传递到其部署的 Verticle?
我有一个 ServerVerticle
,可以从中部署 5-10 ServiceVerticle
。
每个 ServiceVerticle
必须使用相同的共享数据结构 - Map<Integer, Short[]>
可以是 100-2000 Mb。
问题 - 我无法创建 Local
以数组作为值的地图。
我看到的唯一内存中解决方案 - 将 int[][]
的副本传递给部署上的每个 ServiceVerticle
,并保留 5-10 个数据副本。
P.S。这个数据结构必须尽可能快地查找,所以我不喜欢像 Hazelcast 这样的集群范围的解决方案 IMap
.
虽然您可以在 LocalMap
中使用的类型没有太多自由,但您可以使用 Buffer
。缓冲区是经过优化的字节数组,您可以快速调整它以适应您的用例。使用 Buffer
还意味着您将拥有紧凑的内存表示,因此您可以节省内存并且任何操作都会很快。
你只需要写一个从二维平面到一维线的转换。例如假设您有以下数组 (2 x 3):
int[][] data = new int[] {
new int[] {1, 2, 3},
new int[] {4, 5, 6},
};
如果将其转换为缓冲区:
Buffer.buffer()
.appendInt(1).appendInt(2).appendInt(3)
.appendInt(4).appendInt(5).appendInt(6);
(您以后可以只使用字节表示,这只是为了说明它是如何工作的)。
现在您可以通过以下方式引用任何 x
、y
:
int getInt(int x, int y) {
// transform from 2D to 1D
int pos = y * LENGTH + x;
// Where LENGTH is the the example: 3
// For safety assert on length
if (pos > buffer.length()) throw new ArrayIndexOutOfBoundsException();
// TODO: assert on min, max (x, y)
return buffer.getInt(pos);
}