Frage

Ich habe Zugriff auf einen Echtzeit-KDB-Server mit Tabellen mit neuen Daten, die jede Millisekunde eintreffen.

Derzeit verwende ich nur eine naive Methode, die im Grunde so aussieht:

.z.ts:{
    newData: getNewData[];   / get data arriving in the last second
    data::data uj newData;
};
\t 100;

um sicherzustellen, dass meine Daten (benannt data) wird ständig aktualisiert.

Allerdings ist die uj ist sehr langsam (wahrscheinlich aufgrund der ständigen Neuzuweisung von Speicher) und das Abfragen ist einfach nur umständlich.

Ich habe gehört, dass KDB gut mit dieser Art von Streaming-Tick-Daten umgehen soll, also gibt es einen besseren Weg?Vielleicht eine Push-basierte Methode ohne Notwendigkeit uj?

War es hilfreich?

Lösung

Anstatt zu wählen.Kdb+verwenden Kreuzen Sie die Abonnentenarchitektur für kdb+ veröffentlichen an.

Andere Tipps

Wenn es eine Echtzeit gibt, füttert vermutlich eine Tickerpflanze sie.Sie können den Tickerplant abonnieren:

.u.sub[`;`];

Das bedeutet unter alle Tabellen, alle Symbole.Das Ergebnis des Aufrufs ist ein Array, in dem das 0. Element der Tabellenname und das 1. Element die aktuellen Daten sind, die das Tickerplant für diese Tabelle enthält (normalerweise leer oder eine kleine Anzahl von Zeilen).Das Tickerplant speichert dann das Handle in Ihrer kdb-Instanz zwischen und sendet ihm weiterhin Daten.ABER es geht davon aus, dass es eine gibt upd funktion auf Ihrer kdb-Instanz, die die Anforderung verarbeiten kann.

upd:{[t;x] t insert x}

ODER

upd:insert

(gleiche Sache)

Die upd-Funktion wird mit einem Tabellensymbolnamen aufgerufen (t) und die einzufügenden Daten (x).

Eine gute unkomplizierte Implementierung wäre also insgesamt:

upd:insert;
@[`.;:;t:.u.sub[`;`][0];t[1]];  //set result of sub to t, set t to t[1] (initial result)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top