Wie streame ich Daten in KDB?
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
?
Lösung
Anstatt zu wählen.Kdb+verwenden Kreuzen Sie die Abonnentenarchitektur für kdb+ veröffentlichen an.
- Offizielles Handbuch: https://github.com/KxSystems/kdb/blob/master/d/tick.htm
- kdb+ Tick Übersicht: http://www.timestored.com/kdb-guides/kdb-tick-data-store
- Quellcode: https://github.com/KxSystems/kdb-tick
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)