如何将int[][]数组的副本传递到它的部署上?
我有一个ServerVerticle,从它可以部署5-10 ServiceVerticle。
每个ServiceVerticle必须使用相同的共享数据结构- Map<Integer, Short[]>,可以是100-2000 Mb。
问题-我不能用数组作为值创建Local映射。
我看到的唯一内存中的解决方案是将int[][]的副本传递给部署中的每个ServiceVerticle,并保留5-10个数据副本。
这个数据结构必须具有尽可能快的查找速度,所以我不喜欢像Hazelcast IMap这样的集群范围的解决方案。
发布于 2016-11-01 10:07:10
虽然您可以在LocalMap中使用的类型没有太多的自由度,但是您可以使用Buffer的。缓冲区是一个优化的字节数组,您可以快速地根据您的用例调整它。使用Buffer也意味着您将有一个紧凑的内存表示,这样您就可以节省内存,并且任何操作都将是快速的。
你只需要写一个从二维平面到一维线的转换。例如,假设您有以下数组(2x3):
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);
}https://stackoverflow.com/questions/40352471
复制相似问题