KDB +, ein
KX- Produkt, ist eine bekannte, extrem schnelle
Säulendatenbank mit engen Kreisen, in der Zeitreihen und darauf basierende analytische Berechnungen gespeichert werden. Anfangs war es in der Finanzbranche sehr beliebt (und erfreut sich großer Beliebtheit) - es wird von allen Top-10-Investmentbanken und vielen bekannten Hedgefonds, Börsen und anderen Organisationen verwendet. Vor kurzem hat KX beschlossen, seinen Kundenstamm zu erweitern und jetzt Lösungen in anderen Bereichen anzubieten, in denen eine große Datenmenge nach Zeit oder auf andere Weise sortiert ist - Telekommunikation, Bioinformatik, Produktion usw. Insbesondere wurden sie Partner des Aston Martin Red Bull Racing-Teams in der Formel 1, wo sie helfen, Daten von Autosensoren zu sammeln und zu verarbeiten und Tests in einem Windkanal zu analysieren. In diesem Artikel möchte ich Ihnen erklären, welche Funktionen von KDB + es überproduktiv machen, warum Unternehmen bereit sind, viel Geld dafür auszugeben, und schließlich, warum dies nicht wirklich eine Datenbank ist.

In diesem Artikel werde ich versuchen, allgemein zu erklären, was KDB + ist, welche Funktionen und Einschränkungen es hat und welchen Nutzen es für Unternehmen hat, die große Datenmengen verarbeiten möchten. Ich werde nicht auf die Details der Implementierung von KDB + und die Details seiner Q-Programmiersprache eingehen. Beide Themen sind sehr umfangreich und verdienen separate Artikel. Viele Informationen zu diesen Themen finden Sie unter code.kx.com, einschließlich eines Buches über Q - Q für Sterbliche (siehe Link unten).
Einige Begriffe
- In-Memory-Datenbank. Eine Datenbank, die Daten im RAM für einen schnelleren Zugriff speichert. Die Vorteile einer solchen Datenbank sind verständlich, und die Nachteile sind die Möglichkeit eines Datenverlusts und die Notwendigkeit, viel Speicher auf dem Server zu haben.
- Spaltendatenbank. Eine Datenbank, in der Daten in Serie gespeichert werden und nicht Datensatz für Datensatz. Der Hauptvorteil einer solchen Datenbank besteht darin, dass Daten aus einer Spalte zusammen auf der Festplatte und im Speicher gespeichert werden, was den Zugriff auf sie erheblich beschleunigt. Es ist nicht erforderlich, Spalten zu laden, die in der Anforderung nicht verwendet werden. Der Hauptnachteil ist, dass es schwierig ist, Datensätze zu ändern und zu löschen.
- Zeitreihen. Daten mit einer Spalte wie Datum oder Uhrzeit. In der Regel ist die zeitliche Reihenfolge für solche Daten wichtig, damit Sie leicht feststellen können, welcher Datensatz dem aktuellen vorausgeht oder folgt, oder Funktionen anwenden können, deren Ergebnis von der Reihenfolge der Datensätze abhängt. Klassische Datenbanken basieren auf einem völlig anderen Prinzip - einer Reihe von Datensätzen als Satz, bei dem die Reihenfolge der Datensätze im Prinzip nicht definiert ist.
- Vektor. In diesem Zusammenhang ist KDB + eine Liste von Elementen desselben Atomtyps, z. B. Zahlen. Mit anderen Worten, ein Array von Elementen. Arrays können im Gegensatz zu Listen kompakt gespeichert und mithilfe von Vektorprozessoranweisungen verarbeitet werden.
Historischer Hintergrund
KX wurde 1993 von Arthur Whitney gegründet, der zuvor bei der Morgan Stanley Bank bei A +, dem Nachfolger von APL, einer sehr originellen und beliebten Sprache in der Finanzwelt, gearbeitet hatte. Natürlich fuhr Arthur in KX im gleichen Sinne fort und schuf die vektorfunktionale Sprache K, die von den Ideen des radikalen Minimalismus geleitet wurde. K-Programme sehen aus wie ein unordentlicher Satz von Satzzeichen und Sonderzeichen, die Bedeutung von Zeichen und Funktionen hängt vom Kontext ab, und jede Operation hat viel mehr Bedeutung als in üblichen Programmiersprachen. Aus diesem Grund nimmt das K-Programm ein Minimum an Speicherplatz ein - mehrere Zeilen können Textseiten einer ausführlichen Sprache wie Java ersetzen - und ist eine hochkonzentrierte Implementierung des Algorithmus.
Eine Funktion auf K, die den größten Teil des LL1-Parsergenerators gemäß einer bestimmten Grammatik implementiert:
1. pp:{q:{(x;p3(),y)};r:$[-11=@x;$x;11=@x;q[`N;$*x];10=abs@@x;q[`N;x] 2. ($)~*x;(`P;p3 x 1);(1=#x)&11=@*x;pp[{(1#x;$[2=#x;;,:]1_x)}@*x] 3. (?)~*x;(`Q;pp[x 1]);(*)~*x;(`M;pp[x 1]);(+)~*x;(`MP;pp[x 1]);(!)~*x;(`Y;p3 x 1) 4. (2=#x)&(@x 1)in 100 101 107 7 -7h;($[(@x 1)in 100 101 107h;`Ff;`Fi];p3 x 1;pp[*x]) 5. (|)~*x;`S,(pp'1_x);2=#x;`C,{@[@[x;-1+#x;{x,")"}];0;"(",]}({$[".sC"~4#x;6_-2_x;x]}'pp'x);'`pp]; 6. $[@r;r;($[1<#r;".s.";""],$*r),$[1<#r;"[",(";"/:1_r),"]";""]]}
Arthur verkörperte diese Philosophie der extremen Effizienz auch mit einem Minimum an Körperbewegungen in KDB +, die 2003 erschien (ich denke, es ist jetzt klar, woher der Buchstabe K vom Namen stammt), und es gibt nichts weiter als einen Interpreten der vierten Version der Sprache K. Eine für das Auge des Benutzers angenehmere Version wird zu K hinzugefügt K unter dem Namen Q. Q bietet außerdem Unterstützung für einen bestimmten SQL-Dialekt - QSQL - und im Interpreter Unterstützung für Tabellen als Systemdatentyp, Tools für die Arbeit mit Tabellen im Speicher und auf der Festplatte usw.
Aus Sicht des Benutzers ist KDB + daher nur ein Q-Interpreter mit Unterstützung für Tabellen und SQL-ähnliche Ausdrücke im LINQ-Stil aus C #. Dies ist der wichtigste Unterschied zwischen KDB + und anderen Datenbanken und der Hauptwettbewerbsvorteil, der häufig übersehen wird. Dies ist keine Datenbank + eine deaktivierte Hilfssprache, sondern eine vollwertige, leistungsstarke Programmiersprache + integrierte Unterstützung für Datenbankfunktionen. Dieser Unterschied wird eine entscheidende Rolle bei der Auflistung aller Vorteile von KDB + spielen. Zum Beispiel ...
Größe
Nach modernen Maßstäben ist KDB + nur eine mikroskopische Größe. Dies ist buchstäblich eine ausführbare Datei, die kleiner als ein Megabyte ist, und eine kleine Textdatei mit einigen Systemfunktionen. Eigentlich - weniger als ein Megabyte und für dieses Programm zahlen Unternehmen Zehntausende von Dollar pro Jahr für einen Prozessor auf dem Server.
- Mit dieser Größe fühlt sich KDB + auf jeder Hardware großartig an - vom Pi-Mikrocomputer bis zu Servern mit Terabyte Speicher. Dies hat keinerlei Auswirkungen auf die Funktionalität. Darüber hinaus wird Q sofort gestartet, sodass es auch als Skriptsprache verwendet werden kann.
- Bei dieser Größe befindet sich der Q-Interpreter vollständig im Prozessor-Cache, was die Ausführung von Programmen beschleunigt.
- Bei dieser Größe der ausführbaren Datei nimmt der Q-Prozess vernachlässigbaren Speicherplatz ein, Sie können sie in Hunderten ausführen. Gleichzeitig kann Q bei Bedarf mit zehn oder Hunderten von Gigabyte Speicher in einem Prozess arbeiten.
Vielseitigkeit
Q ist perfekt für eine Vielzahl von Aufgaben. Der Q-Prozess kann als historische Datenbank dienen und einen schnellen Zugriff auf Terabyte an Informationen ermöglichen. Zum Beispiel haben wir Dutzende historischer Datenbanken, von denen einige an einem unkomprimierten Datentag mehr als 100 Gigabyte benötigen. Mit angemessenen Einschränkungen wird die Datenbankabfrage jedoch in zehn bis hundert Millisekunden ausgeführt. Im Allgemeinen haben wir ein universelles Zeitlimit für Benutzeranfragen - 30 Sekunden - und es funktioniert sehr selten.
Mit der gleichen Leichtigkeit kann Q eine In-Memory-Datenbank sein. Das Hinzufügen neuer Daten zu Tabellen im Speicher ist so schnell, dass Benutzerabfragen ein begrenzender Faktor sind. Die Daten in den Tabellen werden in Spalten gespeichert. Dies bedeutet, dass bei jeder Operation in der Spalte der Prozessor-Cache mit voller Kapazität verwendet wird. Darüber hinaus versuchte KX, alle grundlegenden Operationen wie die Arithmetik durch Vektorprozessoranweisungen zu implementieren, um deren Geschwindigkeit zu maximieren. Q kann Aufgaben ausführen, die für Datenbanken nicht charakteristisch sind - beispielsweise Streaming-Daten verarbeiten und in "Echtzeit" (mit einer Verzögerung von mehreren zehn Millisekunden bis zu mehreren Sekunden, abhängig von der Aufgabe) verschiedene Aggregatfunktionen für Finanzinstrumente für verschiedene Zeitintervalle berechnen oder ein Modell für die Auswirkungen von Perfect erstellen Transaktionen auf den Markt und führen die Profilerstellung fast unmittelbar nach ihrer Fertigstellung durch. Bei solchen Problemen ist die Hauptzeitverzögerung meistens nicht Q, sondern die Notwendigkeit, Daten aus verschiedenen Quellen zu synchronisieren. Eine hohe Geschwindigkeit wird erreicht, weil sich die Daten und Funktionen, die sie verarbeiten, im selben Prozess befinden und die Verarbeitung auf die Ausführung mehrerer QSQL-Ausdrücke und Verknüpfungen reduziert wird, die nicht interpretiert, sondern im Binärcode ausgeführt werden.
Schließlich können alle Serviceprozesse auch in Q geschrieben werden. Beispielsweise Gateway-Prozesse, die Benutzeranforderungen automatisch an die erforderlichen Datenbanken und Server verteilen. Der Programmierer hat die völlige Freiheit, jeden Algorithmus zum Ausgleichen, Priorisieren, Fehlertoleranz, Zugriffsrecht, Kontingent und allgemein nach Herzenslust zu implementieren. Das Hauptproblem hierbei ist, dass Sie dies alles selbst implementieren müssen.
Als Beispiel werde ich auflisten, welche Arten von Prozessen wir haben. Alle von ihnen werden aktiv genutzt und arbeiten zusammen, indem sie Dutzende verschiedener Datenbanken kombinieren, Daten aus vielen Quellen verarbeiten und Hunderte von Benutzern und Anwendungen bedienen.
- Konnektoren (Feedhandler) zu Datenquellen. Diese Prozesse verwenden normalerweise externe Bibliotheken, die in Q geladen werden. Die C-Schnittstelle in Q ist äußerst einfach und ermöglicht das einfache Erstellen von Proxy-Funktionen für jede C / C ++ - Bibliothek. Q ist schnell genug, um beispielsweise den Fluss von FIX-Nachrichten von allen europäischen Börsen gleichzeitig zu verarbeiten.
- Tickerplant-Händler, die als Zwischenverbindung zwischen Steckverbindern und Verbrauchern dienen. Gleichzeitig schreiben sie eingehende Daten in ein spezielles Binärprotokoll und bieten den Verbrauchern Widerstand gegen Verbindungsverlust oder Neustart.
- In-Memory-Datenbank (rdb). Diese Datenbanken bieten den schnellsten Zugriff auf frische Rohdaten und speichern diese im Speicher. In der Regel sammeln sie tagsüber Daten in Tabellen und setzen sie nachts auf Null.
- Persist-Datenbank (pdb). Diese Datenbanken bieten heute Datenspeicherung in der historischen Datenbank. Im Gegensatz zu rdb speichern sie in der Regel keine Daten im Speicher, sondern verwenden einen speziellen Cache auf der Festplatte für einen Tag und kopieren die Daten um Mitternacht in die historische Datenbank.
- Historische Grundlagen (hdb). Diese Datenbanken bieten Zugriff auf Daten für frühere Tage, Monate und Jahre. Ihre Größe (in Tagen) ist nur durch die Größe der Festplatten begrenzt. Daten können sich überall befinden, insbesondere auf verschiedenen Festplatten, um einen schnelleren Zugriff zu ermöglichen. Es ist möglich, Daten mit mehreren Algorithmen zu komprimieren. Die Datenbankstruktur ist gut dokumentiert und einfach. Die Daten werden pro Einheit in normalen Dateien gespeichert, damit sie auch unter Verwendung des Betriebssystems verarbeitet werden können.
- Datenbanken mit aggregierten Informationen. Verschiedene Aggregationen werden gespeichert, normalerweise mit, gruppiert nach Instrumentenname und Zeitintervall. In-Memory-Datenbanken aktualisieren ihren Status mit jeder eingehenden Nachricht, und historische Datenbanken speichern vorberechnete Daten, um den Zugriff auf historische Daten zu beschleunigen.
- Schließlich verarbeitet Gateway Prozesse, die Anwendungen und Benutzer bedienen. Mit Q können Sie die vollständig asynchrone Verarbeitung eingehender Nachrichten implementieren, diese auf Datenbanken verteilen, Zugriffsrechte überprüfen usw. Ich stelle fest, dass Nachrichten nicht auf SQL-Anweisungen beschränkt sind und meistens keine SQL-Anweisungen sind, wie dies in anderen Datenbanken der Fall ist. In den meisten Fällen ist der SQL-Ausdruck in einer speziellen Funktion verborgen und basiert auf den vom Benutzer angeforderten Parametern. Die Zeit wird konvertiert, gefiltert, die Daten werden normalisiert (z. B. wird der Aktienkurs ausgeglichen, wenn Dividenden gezahlt wurden) usw.
Typische Architektur für einen Datentyp:

Geschwindigkeit
Obwohl Q eine interpretierte Sprache ist, ist es gleichzeitig eine Vektorsprache. Dies bedeutet, dass viele integrierte Funktionen, insbesondere die Arithmetik, Argumente jeglicher Form akzeptieren - Zahlen, Vektoren, Matrizen, Listen, und vom Programmierer wird erwartet, dass er das Programm als Operationen auf Arrays implementiert. Wenn Sie in einer solchen Sprache zwei Vektoren in einer Million Elementen hinzufügen, spielt es keine Rolle mehr, dass die Sprache interpretiert wird. Die Addition wird durch eine superoptimierte Binärfunktion ausgeführt. Da der Löwenanteil der Zeit in Q-Programmen für Operationen mit Tabellen unter Verwendung dieser grundlegenden vektorisierten Funktionen aufgewendet wird, haben wir eine sehr anständige Ausgabegeschwindigkeit, die es uns ermöglicht, eine große Datenmenge selbst in einem Prozess zu verarbeiten. Dies ähnelt den Mathematikbibliotheken in Python - obwohl Python selbst eine sehr langsame Sprache ist, verfügt es über viele großartige Numpy-Bibliotheken, mit denen Sie numerische Daten mit der Geschwindigkeit einer kompilierten Sprache verarbeiten können (Numpy ist übrigens ideologisch nahe an Q).
Darüber hinaus ging KX sehr sorgfältig mit der Gestaltung von Tischen um und optimierte die Arbeit mit ihnen. Erstens werden verschiedene Arten von Indizes unterstützt, die von integrierten Funktionen unterstützt werden und nicht nur auf Tabellenspalten, sondern auch auf beliebige Vektoren angewendet werden können - Gruppierung, Sortierung, Eindeutigkeitsattribut und spezielle Gruppierung für historische Datenbanken. Der Index wird elementar überlagert und beim Hinzufügen von Elementen zur Spalte / zum Vektor automatisch angepasst. Indizes können Tabellenspalten sowohl im Speicher als auch auf der Festplatte gleichermaßen gut überlappen. Bei der Ausführung einer QSQL-Abfrage werden Indizes nach Möglichkeit automatisch verwendet. Zweitens erfolgt die Arbeit mit historischen Daten über den OS-Dateizuordnungsmechanismus (Speicherzuordnung). Große Tabellen werden nie in den Speicher geladen, stattdessen werden die erforderlichen Spalten direkt dem Speicher zugeordnet und nur der Teil davon wird tatsächlich geladen (Indizes helfen auch hier), der benötigt wird. Für den Programmierer gibt es keinen Unterschied, ob sich die Daten im Speicher befinden oder nicht. Der Mechanismus für die Arbeit mit mmap ist vollständig im Darm von Q verborgen.
KDB + ist keine relationale Datenbank. Tabellen können beliebige Daten enthalten, während sich die Reihenfolge der Zeilen in der Tabelle beim Hinzufügen neuer Elemente nicht ändert und beim Schreiben von Abfragen verwendet werden kann und sollte. Diese Funktion wird dringend für die Arbeit mit Zeitreihen (Daten aus Austausch, Telemetrie, Ereignisprotokollen) benötigt. Wenn die Daten nach Zeit sortiert sind, muss der Benutzer keine SQL-Tricks verwenden, um die erste oder letzte Zeile oder N Zeilen in der Tabelle zu finden , bestimmen Sie, welche Linie der N-ten Linie folgt usw. Das Verknüpfen von Tabellen wird noch einfacher, da beispielsweise für 16.000 Transaktionen VOD.L (Vodafone) das letzte Anführungszeichen in einer Tabelle mit 500 Millionen Elementen etwa eine Sekunde auf der Festplatte und ein Dutzend Millisekunden im Speicher benötigt.
Ein Beispiel für eine Zeitverknüpfung ist, dass die Anführungszeichen-Tabelle dem Speicher zugeordnet ist, sodass VOD.L nicht angegeben werden muss, wobei der Index für die sym-Spalte implizit verwendet wird und die Daten nach Zeit sortiert sind. Fast alle Verknüpfungen in Q sind normale Funktionen, die nicht Teil der select-Anweisung sind:
1. aj[`sym`time;select from trade where date=2019.03.26, sym=`VOD.L;select from quote where date=2019.03.26]
Schließlich ist anzumerken, dass die Ingenieure bei KX, beginnend mit Arthur Whitney selbst, wirklich von Effizienz besessen sind und alle Anstrengungen unternehmen, um die Standard-Q-Funktionen optimal zu nutzen und die gängigsten Verwendungsmuster zu optimieren.
Zusammenfassung
KDB + ist vor allem aufgrund seiner außergewöhnlichen Vielseitigkeit bei Unternehmen beliebt. Es dient sowohl als In-Memory-Basis als auch als Basis für die Speicherung von Terabyte historischer Daten und als Plattform für die Datenanalyse. Aufgrund der Tatsache, dass die Datenverarbeitung direkt in der Datenbank erfolgt, werden eine hohe Betriebsgeschwindigkeit und Ressourceneinsparungen erzielt. Eine vollwertige Programmiersprache, die in die Datenbankfunktionen integriert ist, ermöglicht es Ihnen, den gesamten Stapel der erforderlichen Prozesse auf derselben Plattform zu implementieren - vom Empfang von Daten bis zur Verarbeitung von Benutzeranforderungen.
Zusätzliche Informationen
Nachteile
Ein wesentlicher Nachteil von KDB + / Q ist die hohe Eintrittsschwelle. Die Sprache hat eine seltsame Syntax, einige Funktionen sind stark überladen (Wert hat beispielsweise etwa 11 Anwendungsfälle). Vor allem erfordert es einen radikal anderen Ansatz beim Schreiben von Programmen. In einer Vektorsprache müssen Sie ständig an Array-Transformationen denken, alle Zyklen durch verschiedene Optionen der Map / Reduce-Funktionen (in Q Adverbien genannt) implementieren und niemals versuchen, Geld zu sparen, indem Sie Vektoroperationen durch atomare ersetzen. Um beispielsweise den Index des n-ten Auftretens eines Elements in einem Array zu ermitteln, schreiben Sie:
1. (where element=vector)[N]
obwohl dies nach C / Java-Standards furchtbar ineffizient aussieht (= erstellt einen Booleschen Vektor, in dem die Indizes der wahren Elemente darin zurückgegeben werden). Ein solcher Datensatz macht die Bedeutung des Ausdrucks jedoch verständlicher und Sie verwenden schnelle Vektoroperationen anstelle langsamer atomarer. Der konzeptionelle Unterschied zwischen der Vektorsprache und dem Rest ist vergleichbar mit dem Unterschied zwischen den imperativen und funktionalen Programmieransätzen, und Sie müssen darauf vorbereitet sein.
Einige Benutzer sind auch mit QSQL unzufrieden. Tatsache ist, dass es nur wie echtes SQL aussieht. Tatsächlich ist es nur ein Interpreter von SQL-ähnlichen Ausdrücken, der die Abfrageoptimierung nicht unterstützt. Der Benutzer selbst muss die optimalen Abfragen und auf Q schreiben, für die viele nicht bereit sind. Auf der anderen Seite können Sie natürlich immer selbst Ihre optimale Abfrage schreiben und sich nicht auf einen Black-Box-Optimierer verlassen.
Außerdem ist ein Buch über Q - Q für Sterbliche kostenlos auf
der Website des Unternehmens verfügbar , und es gibt auch viele andere nützliche Materialien.
Ein weiteres großes Minus sind die Lizenzkosten. Dies sind Zehntausende von Dollar pro Jahr für eine CPU. Nur große Unternehmen können sich solche Ausgaben leisten. Vor kurzem hat KX die Lizenzierungsrichtlinien flexibler gestaltet und bietet die Möglichkeit, nur für die Nutzungsdauer zu bezahlen oder KDB + in den Clouds von Google und Amazon zu mieten. KX bietet auch an, eine
kostenlose Version für nichtkommerzielle Zwecke herunterzuladen (32-Bit-Version oder 64-Bit auf Anfrage).
Wettbewerber
Es gibt einige spezialisierte Datenbanken, die auf ähnlichen Prinzipien basieren - säulenförmige In-Memory-Datenbanken, die sich auf sehr große Datenmengen konzentrieren. Das Problem ist, dass dies spezialisierte Datenbanken sind. Ein Paradebeispiel ist Clickhouse. Diese Datenbank ähnelt dem KDB + -Prinzip zum Speichern von Daten auf der Festplatte und zum Erstellen des Index. Sie führt einige Abfragen schneller als KDB + aus, wenn auch nicht wesentlich. Aber auch wenn die Clickhouse-Datenbank spezialisierter ist als KDB + - Webanalyse im Vergleich zu beliebigen Zeitreihen (dieser Unterschied ist sehr wichtig - zum Beispiel gibt es in Clickhouse keine Möglichkeit, die Datensatzreihenfolge zu verwenden). Vor allem aber verfügt Clickhouse nicht über die Universalität von KDB +, einer Sprache, mit der Daten direkt in der Datenbank verarbeitet werden können, anstatt sie zuvor in eine separate Anwendung zu laden, beliebige SQL-Ausdrücke zu erstellen, beliebige Funktionen in einer Abfrage anzuwenden und Prozesse zu erstellen, die nicht mit der Ausführung historischer Datenbankfunktionen zusammenhängen . Daher ist es schwierig, KDB + mit anderen Datenbanken zu vergleichen. Sie sind möglicherweise in separaten Anwendungsfällen besser oder einfach besser, wenn wir über die Aufgaben klassischer Datenbanken sprechen, aber ich kenne kein anderes ebenso effektives und universelles Tool für die Verarbeitung temporärer Daten.
Python-Integration
Um KDB + für Neulinge zu vereinfachen, hat KX Bibliotheken für die enge Integration mit Python in einem einzigen Prozess erstellt. Sie können entweder eine beliebige Python-Funktion von Q aus aufrufen oder umgekehrt - Sie können eine beliebige Q-Funktion von Python aus aufrufen (insbesondere QSQL-Ausdrücke). Bibliotheken konvertieren bei Bedarf (aus Gründen der Effizienz nicht immer) Daten aus dem Format einer Sprache in das Format einer anderen. Infolgedessen leben Q und Python in einer so engen Symbiose, dass die Grenzen zwischen ihnen aufgehoben werden. Dadurch hat ein Programmierer einerseits vollen Zugriff auf zahlreiche nützliche Python-Bibliotheken, andererseits erhält er eine schnelle Basis für die Arbeit mit in Python integrierten Big Data, was besonders für diejenigen nützlich ist, die am maschinellen Lernen oder Modellieren beteiligt sind.
Arbeiten mit Q in Python:
1. >>> q() 2.q)trade:([]date:();sym:();qty:()) 3. q)\ 4. >>> q.insert('trade', (date(2006,10,6), 'IBM', 200)) 5. k(',0') 6. >>> q.insert('trade', (date(2006,10,6), 'MSFT', 100)) 7. k(',1')
Referenzen
Unternehmenswebsite -
https://kx.com/Website für Entwickler -
https://code.kx.com/v2/Q Für Sterbliche Buch (in Englisch) -
https://code.kx.com/q4m3/Artikel zum Thema KDB + / Q-Anwendungen von kx-Mitarbeitern -
https://code.kx.com/v2/wp/