首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vertx:将初始数据传递给it部署的垂直点

Vertx:将初始数据传递给it部署的垂直点
EN

Stack Overflow用户
提问于 2016-11-01 00:24:01
回答 1查看 173关注 0票数 0

如何将int[][]数组的副本传递到它的部署上?

我有一个ServerVerticle,从它可以部署5-10 ServiceVerticle

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

问题-我不能用数组作为值创建Local映射。

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

这个数据结构必须具有尽可能快的查找速度,所以我不喜欢像Hazelcast IMap这样的集群范围的解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-01 10:07:10

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

你只需要写一个从二维平面到一维线的转换。例如,假设您有以下数组(2x3):

代码语言:javascript
复制
int[][] data = new int[] {
  new int[] {1, 2, 3},
  new int[] {4, 5, 6},
};

如果将其转换为缓冲区:

代码语言:javascript
复制
Buffer.buffer()
  .appendInt(1).appendInt(2).appendInt(3)
  .appendInt(4).appendInt(5).appendInt(6);

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

现在您可以通过执行以下操作来引用任何xy

代码语言:javascript
复制
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);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40352471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档