2016-11-01 3 views
0

Wie kann ich die Kopie von int[][] Array an verticle auf Deployment übergeben?Vertx: erste Daten an vertikales Deployment weitergeben

Ich habe eine ServerVerticle von denen deploy 5-10 ServiceVerticle s.

Jeder der ServiceVerticle muss die gleiche gemeinsame Datenstruktur verwenden - Map<Integer, Short[]>, die 100-2000 Mb sein kann.

Problem - Ich kann keine Local Karte mit Array als Wert erstellen.

Die einzige In-Memory-Lösung, die ich sehe - Kopie von int[][] zu jedem ServiceVerticle auf ihr Deployment übergeben und 5-10 Kopien der Daten behalten.

P.S. Diese Datenstruktur muss so schnell wie möglich nachschlagen, daher mag ich Cluster-weite Lösungen wie Hazelcast IMap nicht.

Antwort

1

Während es nicht viel Freiheit in den Typen gibt, die Sie in einem LocalMap verwenden können, können Sie Buffer s verwenden. Ein Puffer ist ein optimiertes Byte-Array und Sie können ihn schnell an Ihren Anwendungsfall anpassen. Die Verwendung einer Buffer bedeutet auch, dass Sie eine kompakte Darstellung im Speicher haben, so können Sie Speicher sparen und alle Operationen werden schnell sein.

Sie müssen nur eine Transformation von einer 2D-Ebene in eine 1D-Linie schreiben. Zum Beispiel sagen, dass Sie das folgende Feld (2 x 3):

int[][] data = new int[] { 
    new int[] {1, 2, 3}, 
    new int[] {4, 5, 6}, 
}; 

Wenn Sie es zu einem Puffer-Transformation:

Buffer.buffer() 
    .appendInt(1).appendInt(2).appendInt(3) 
    .appendInt(4).appendInt(5).appendInt(6); 

(Sie können später nur die Byte-Darstellung verwenden, das ist billig um zu veranschaulichen, wie es funktioniert).

Jetzt können Sie zu jedem x beziehen, y by doing:

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