Vertx:将初始数据传递给它上面的Verticle

时间:2016-11-01 00:24:01

标签: java vert.x

如何在部署时将int[][]数组的副本传递给Verticle?

我有ServerVerticle部署5-10 ServiceVerticle

每个ServiceVerticle必须使用相同的共享数据结构 - Map<Integer, Short[]>,可以是100-2000 Mb。

问题 - 我无法使用数组创建Local地图作为值。

我看到的唯一内存解决方案 - 将int[][]的副本传递给部署中的每个ServiceVerticle,并保留5-10份数据。

P.S。此数据结构必须尽可能快地查找,因此我不喜欢像Hazelcast IMap这样的群集范围的解决方案。

1 个答案:

答案 0 :(得分:1)

虽然您在LocalMap中可以使用的类型没有多少自由,但您可以使用Buffer。缓冲区是优化的字节数组,您可以根据自己的使用情况快速调整它。使用Buffer也意味着你将拥有一个紧凑的内存表示,这样你就可以节省内存,任何操作都会很快。

您只需要编写从2D平面到1D线的转换。例如,假设您有以下数组(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);

(稍后您可以使用字节表示,这只是为了说明它是如何工作的。)

现在,您可以通过以下方式引用任何xy

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);
}