KDB+-Datenbank: von der Finanzwelt bis zur Formel 1

KDB+, Firmenprodukt KX ist eine in engen Kreisen weithin bekannte, extrem schnelle, spaltenbasierte Datenbank zur Speicherung von Zeitreihen und darauf basierenden analytischen Berechnungen. Anfangs war (und ist) es in der Finanzbranche sehr beliebt – alle Top-10-Investmentbanken und viele namhafte Hedgefonds, Börsen und andere Organisationen nutzen es. Kürzlich hat KX beschlossen, seinen Kundenstamm zu erweitern und nun Lösungen in anderen Bereichen anzubieten, in denen es große Datenmengen gibt, sei es nach Zeit oder auf andere Weise organisiert – Telekommunikation, Bioinformatik, Fertigung usw. Sie wurden außerdem Partner des Aston Martin Red Bull Racing-Teams in der Formel 1, wo sie bei der Erfassung und Verarbeitung von Daten von Fahrzeugsensoren sowie bei der Analyse von Windkanaltests helfen. In diesem Artikel möchte ich Ihnen sagen, welche Funktionen KDB+ zu einer überragenden Leistung machen, warum Unternehmen bereit sind, viel Geld dafür auszugeben und schließlich, warum es sich nicht wirklich um eine Datenbank handelt.
 
KDB+-Datenbank: von der Finanzwelt bis zur Formel 1
 
In diesem Artikel werde ich versuchen, Ihnen allgemein zu erklären, was KDB+ ist, welche Fähigkeiten und Einschränkungen es hat und welche Vorteile es für Unternehmen hat, die große Datenmengen verarbeiten möchten. Ich werde nicht auf die Details der Implementierung von KDB+ oder die Details seiner Programmiersprache Q eingehen. Beide Themen sind sehr umfassend und verdienen separate Artikel. Viele Informationen zu diesen Themen finden Sie unter code.kx.com, darunter ein Buch über Q – Q For Mortals (siehe Link unten).

Einige Begriffe

  • In-Memory-Datenbank. Eine Datenbank, die Daten für einen schnelleren Zugriff im RAM speichert. Die Vorteile einer solchen Datenbank liegen auf der Hand, die Nachteile liegen jedoch in der Möglichkeit eines Datenverlusts und der Notwendigkeit, viel Speicher auf dem Server zu haben.
  • Spaltendatenbank. Eine Datenbank, in der Daten Spalte für Spalte und nicht Datensatz für Datensatz gespeichert werden. Der Hauptvorteil einer solchen Datenbank besteht darin, dass die Daten einer Spalte gemeinsam auf der Festplatte und im Speicher gespeichert werden, was den Zugriff darauf erheblich beschleunigt. Es ist nicht erforderlich, Spalten zu laden, die in der Abfrage nicht verwendet werden. Der Hauptnachteil besteht darin, dass es schwierig ist, Datensätze zu ändern und zu löschen.
  • Zeitfolgen. Daten mit einer Datums- oder Uhrzeitspalte. In der Regel ist die zeitliche Reihenfolge solcher Daten wichtig, damit Sie leicht bestimmen können, welcher Datensatz dem aktuellen vorausgeht oder folgt, oder um Funktionen anzuwenden, deren Ergebnisse von der Reihenfolge der Datensätze abhängen. Klassische Datenbanken basieren auf einem völlig anderen Prinzip: Sie stellen eine Sammlung von Datensätzen als Menge dar, wobei die Reihenfolge der Datensätze im Prinzip nicht definiert ist.
  • Vektor. Im Kontext von KDB+ ist dies eine Liste von Elementen desselben Atomtyps, beispielsweise Zahlen. Mit anderen Worten, ein Array von Elementen. Arrays können im Gegensatz zu Listen kompakt gespeichert und mithilfe von Vektorprozessoranweisungen verarbeitet werden.

 

Geschichte

KX wurde 1993 von Arthur Whitney gegründet, der zuvor bei der Morgan Stanley Bank an der A+-Sprache arbeitete, dem Nachfolger von APL – einer sehr originellen und einst beliebten Sprache in der Finanzwelt. Natürlich führte Arthur in KX denselben Geist fort und schuf die vektorfunktionale Sprache K, geleitet von den Ideen des radikalen Minimalismus. K-Programme sehen aus wie ein Durcheinander aus Satzzeichen und Sonderzeichen, die Bedeutung von Zeichen und Funktionen hängt vom Kontext ab und jede Operation hat viel mehr Bedeutung als in herkömmlichen Programmiersprachen. Aus diesem Grund nimmt ein K-Programm nur minimalen Platz ein – ein paar Zeilen können Textseiten in einer ausführlichen Sprache wie Java ersetzen – und ist eine hochkonzentrierte Implementierung des Algorithmus.
 
Eine Funktion in K, die den größten Teil des LL1-Parser-Generators 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;"(",]}({$[".s.C"~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 mit einem Minimum an Körperbewegungen in KDB+, das 2003 erschien (ich denke, es ist jetzt klar, woher der Buchstabe K im Namen kommt) und nichts anderes als ein Interpret der vierten Version des K ist Zusätzlich zu K K wurde eine benutzerfreundlichere Version namens Q hinzugefügt. Q fügte außerdem Unterstützung für einen bestimmten SQL-Dialekt hinzu – QSQL, und den Interpreter – Unterstützung für Tabellen als Systemdatentyp, Werkzeuge für die Arbeit mit Tabellen im Speicher und auf der Festplatte usw.
 
Aus Benutzersicht ist KDB+ also einfach ein Q-Sprachinterpreter mit Unterstützung für Tabellen und SQL-ähnliche Ausdrücke im LINQ-Stil von C#. Dies ist der wichtigste Unterschied zwischen KDB+ und anderen Datenbanken und der wichtigste Wettbewerbsvorteil, der oft übersehen wird. Dies ist keine Datenbank + deaktivierte Hilfssprache, sondern eine vollwertige leistungsstarke Programmiersprache + integrierte Unterstützung für Datenbankfunktionen. Diese Unterscheidung wird eine entscheidende Rolle bei der Auflistung aller Vorteile von KDB+ spielen. Zum Beispiel…
 

Größe

Nach modernen Maßstäben ist KDB+ lediglich mikroskopisch klein. Es handelt sich im wahrsten Sinne des Wortes um eine ausführbare Sub-Megabyte-Datei und eine kleine Textdatei mit einigen Systemfunktionen. In Wirklichkeit sind es weniger als ein Megabyte, und für dieses Programm zahlen Unternehmen jährlich Zehntausende Dollar für einen Prozessor auf dem Server.

  • Dank dieser Größe fühlt sich KDB+ auf jeder Hardware großartig an – vom Pi-Mikrocomputer bis hin zu Servern mit Terabyte Arbeitsspeicher. Die Funktionalität wird dadurch in keiner Weise beeinträchtigt, außerdem startet Q sofort und kann daher unter anderem als Skriptsprache verwendet werden.
  • Bei dieser Größe passt der Q-Interpreter vollständig in den Prozessor-Cache, was die Programmausführung beschleunigt.
  • Bei dieser Größe der ausführbaren Datei nimmt der Q-Prozess vernachlässigbaren Speicherplatz ein; Sie können Hunderte davon ausführen. Darüber hinaus kann Q bei Bedarf innerhalb eines einzigen Prozesses mit Dutzenden oder Hunderten von Gigabyte Speicher arbeiten.

Universalismus

Q eignet sich hervorragend für eine Vielzahl von Anwendungen. Process Q kann als historische Datenbank fungieren und schnellen Zugriff auf Terabytes an Informationen ermöglichen. Wir verfügen beispielsweise über Dutzende historische Datenbanken, in denen ein unkomprimierter Tag an Daten teilweise mehr als 100 Gigabyte einnimmt. Unter angemessenen Einschränkungen wird eine Abfrage an die Datenbank jedoch in einigen zehn bis hunderten Millisekunden abgeschlossen sein. Im Allgemeinen haben wir ein universelles Timeout für Benutzeranfragen – 30 Sekunden – und es funktioniert nur sehr selten.
 
Q könnte genauso gut eine In-Memory-Datenbank sein. Neue Daten werden so schnell zu In-Memory-Tabellen hinzugefügt, dass Benutzeranfragen der limitierende Faktor sind. Daten in Tabellen werden in Spalten gespeichert, was bedeutet, dass jeder Vorgang an einer Spalte den Prozessor-Cache mit voller Kapazität nutzt. Darüber hinaus versuchte KX, alle Grundoperationen wie Arithmetik durch Vektoranweisungen des Prozessors zu implementieren und so deren Geschwindigkeit zu maximieren. Q kann auch Aufgaben ausführen, die für Datenbanken nicht typisch sind – beispielsweise Streaming-Daten verarbeiten und in „Echtzeit“ (mit einer Verzögerung von mehreren zehn Millisekunden bis zu mehreren Sekunden, je nach Aufgabe) verschiedene Aggregationsfunktionen für Finanzinstrumente für unterschiedliche Zeiträume berechnen Intervalle oder erstellen Sie ein Modell des Einflusses perfekter Transaktionen auf den Markt und führen Sie dessen Profilierung fast unmittelbar nach deren Abschluss durch. Bei solchen Aufgaben ist die Hauptzeitverzögerung meist nicht Q, sondern die Notwendigkeit, Daten aus verschiedenen Quellen zu synchronisieren. Eine hohe Geschwindigkeit wird dadurch erreicht, dass sich die Daten und die sie verarbeitenden Funktionen in einem Prozess befinden und die Verarbeitung auf die Ausführung mehrerer QSQL-Ausdrücke und Joins reduziert wird, die nicht interpretiert, sondern durch Binärcode ausgeführt werden.
 
Schließlich können Sie beliebige Serviceprozesse in Q schreiben. Beispielsweise Gateway-Prozesse, die Benutzeranfragen automatisch an die erforderlichen Datenbanken und Server verteilen. Der Programmierer hat die völlige Freiheit, jeden Algorithmus für Balancing, Priorisierung, Fehlertoleranz, Zugriffsrechte, Quoten und im Grunde alles andere, was sein Herz begehrt, zu implementieren. Das Hauptproblem hierbei ist, dass Sie dies alles selbst umsetzen müssen.
 
Als Beispiel werde ich auflisten, welche Arten von Prozessen wir haben. Sie alle werden aktiv genutzt und arbeiten zusammen, indem sie Dutzende verschiedener Datenbanken in einer vereinen, Daten aus mehreren Quellen verarbeiten und Hunderte von Benutzern und Anwendungen bedienen.

  • Konnektoren (Feedhandler) zu Datenquellen. Diese Prozesse nutzen typischerweise externe Bibliotheken, die in Q geladen werden. Die C-Schnittstelle in Q ist äußerst einfach und ermöglicht Ihnen die einfache Erstellung von Proxy-Funktionen für jede C/C++-Bibliothek. Q ist schnell genug, um beispielsweise eine Flut von FIX-Nachrichten aller europäischen Börsen gleichzeitig zu verarbeiten.
  • Datenverteiler (tickerplant), die als Zwischenglied zwischen Steckverbindern und Verbrauchern dienen. Gleichzeitig schreiben sie eingehende Daten in ein spezielles Binärprotokoll und bieten Verbrauchern so Robustheit gegenüber Verbindungsabbrüchen oder Neustarts.
  • In-Memory-Datenbank (RDB). Diese Datenbanken bieten den schnellstmöglichen Zugriff auf frische Rohdaten, indem sie diese im Speicher speichern. Normalerweise sammeln sie tagsüber Daten in Tabellen und setzen sie nachts zurück.
  • Persistenzdatenbank (pdb). Diese Datenbanken stellen sicher, dass die Daten für heute in einer historischen Datenbank gespeichert werden. Im Gegensatz zu RDB speichern sie in der Regel keine Daten im Speicher, sondern nutzen tagsüber einen speziellen Cache auf der Festplatte und kopieren die Daten um Mitternacht in die historische Datenbank.
  • Historische Datenbanken (hdb). Diese Datenbanken bieten Zugriff auf Daten früherer Tage, Monate und Jahre. Ihre Größe (in Tagen) wird nur durch die Größe der Festplatten begrenzt. Daten können sich überall befinden, insbesondere auf unterschiedlichen Datenträgern, um den Zugriff zu beschleunigen. Es ist möglich, Daten mithilfe mehrerer Algorithmen zu komprimieren. Der Aufbau der Datenbank ist gut dokumentiert und einfach, die Daten werden spaltenweise in regulären Dateien gespeichert, so dass sie auch über das Betriebssystem verarbeitet werden können.
  • Datenbanken mit aggregierten Informationen. Sie speichern verschiedene Aggregationen, 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 wird die Gateway-ProzesseWartung von Anwendungen und Benutzern. Mit Q können Sie eine vollständig asynchrone Verarbeitung eingehender Nachrichten implementieren, diese über Datenbanken verteilen, Zugriffsrechte überprüfen usw. Beachten Sie, dass Nachrichten nicht eingeschränkt sind und meistens keine SQL-Ausdrücke sind, wie es in anderen Datenbanken der Fall ist. Meistens ist der SQL-Ausdruck in einer speziellen Funktion versteckt und wird auf der Grundlage der vom Benutzer angeforderten Parameter erstellt – Zeit wird konvertiert, gefiltert, Daten werden normalisiert (z. B. wird der Aktienkurs ausgeglichen, wenn Dividenden gezahlt wurden) usw.

Typische Architektur für einen Datentyp:

KDB+-Datenbank: von der Finanzwelt bis zur Formel 1

Geschwindigkeit

Obwohl Q eine interpretierte Sprache ist, ist es auch eine Vektorsprache. Das bedeutet, dass viele integrierte Funktionen, insbesondere arithmetische, Argumente jeglicher Form annehmen – Zahlen, Vektoren, Matrizen, Listen – und vom Programmierer erwartet wird, dass er das Programm als Array-Operationen implementiert. Wenn Sie in einer solchen Sprache zwei Vektoren mit einer Million Elementen addieren, spielt es keine Rolle mehr, dass die Sprache interpretiert wird; die Addition wird von einer superoptimierten Binärfunktion durchgeführt. Da der Löwenanteil der Zeit in Q-Programmen für Operationen mit Tabellen aufgewendet wird, die diese grundlegenden vektorisierten Funktionen verwenden, ist die Ausgabe eine sehr gute Betriebsgeschwindigkeit, die es uns ermöglicht, sogar in einem Prozess große Datenmengen zu verarbeiten. Dies ähnelt den mathematischen Bibliotheken in Python – obwohl Python selbst eine sehr langsame Sprache ist, verfügt es über viele hervorragende Bibliotheken wie Numpy, mit denen Sie numerische Daten mit der Geschwindigkeit einer kompilierten Sprache verarbeiten können (Numpy steht übrigens ideologisch nahe an Q ).
 
Darüber hinaus hat KX bei der Gestaltung der Tabellen und der Optimierung der Arbeit mit ihnen einen sehr sorgfältigen Ansatz verfolgt. Erstens werden mehrere Arten von Indizes unterstützt, die durch integrierte 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 einfach angewendet und beim Hinzufügen von Elementen zur Spalte/zum Vektor automatisch angepasst. Indizes können gleichermaßen erfolgreich auf Tabellenspalten sowohl im Speicher als auch auf der Festplatte angewendet werden. Bei der Ausführung einer QSQL-Abfrage werden Indizes nach Möglichkeit automatisch verwendet. Zweitens erfolgt die Arbeit mit historischen Daten über den Mechanismus zur Anzeige von Betriebssystemdateien (Speicherzuordnung). Große Tabellen werden nie in den Speicher geladen, sondern die notwendigen Spalten werden direkt in den Speicher gemappt und nur der Teil davon wird tatsächlich geladen (hier helfen auch Indizes), der benötigt wird. Für den Programmierer macht es keinen Unterschied, ob sich die Daten im Speicher befinden oder nicht; der Mechanismus für die Arbeit mit mmap ist vollständig in den Tiefen von Q verborgen.
 
KDB+ ist keine relationale Datenbank; Tabellen können beliebige Daten enthalten, während sich die Reihenfolge der Zeilen in der Tabelle nicht ändert, wenn neue Elemente hinzugefügt werden, und beim Schreiben von Abfragen verwendet werden kann und sollte. Diese Funktion wird für die Arbeit mit Zeitreihen (Daten aus Austauschen, Telemetrie, Ereignisprotokollen) dringend benötigt, denn wenn die Daten nach Zeit sortiert sind, muss der Benutzer keine SQL-Tricks anwenden, um die erste oder letzte Zeile oder N zu finden Zeilen in der Tabelle, bestimmen Sie, welche Zeile auf die N-te Zeile folgt usw. Tabellenverknüpfungen werden noch weiter vereinfacht. Beispielsweise dauert das Finden des letzten Kurses für 16000 VOD.L-Transaktionen (Vodafone) in einer Tabelle mit 500 Millionen Elementen etwa eine Sekunde auf der Festplatte und mehrere zehn Millisekunden im Speicher.
 
Ein Beispiel für einen Zeit-Join: Die Kurstabelle wird dem Speicher zugeordnet, sodass keine Angabe von VOD.L erforderlich ist. Der Index der Sym-Spalte und die Tatsache, dass die Daten nach Zeit sortiert sind, werden implizit verwendet. Fast alle Joins in Q sind reguläre Funktionen und nicht Teil eines ausgewählten Ausdrucks:

1. aj[`sym`time;select from trade where date=2019.03.26, sym=`VOD.L;select from quote where date=2019.03.26]  

Abschließend ist es erwähnenswert, dass die Ingenieure von KX, allen voran Arthur Whitney selbst, wirklich von Effizienz besessen sind und große Anstrengungen unternehmen, um die Standardfunktionen des Q optimal zu nutzen und die gängigsten Nutzungsmuster zu optimieren.
 

Ergebnis

KDB+ ist bei Unternehmen vor allem wegen seiner außergewöhnlichen Vielseitigkeit beliebt – es eignet sich gleichermaßen gut als In-Memory-Datenbank, als Datenbank zur Speicherung von Terabytes an historischen Daten und als Plattform für die Datenanalyse. Dadurch, dass die Datenverarbeitung direkt in der Datenbank erfolgt, werden eine hohe Arbeitsgeschwindigkeit und Ressourceneinsparungen erreicht. Eine vollwertige Programmiersprache mit integrierten Datenbankfunktionen ermöglicht es Ihnen, den gesamten Stapel notwendiger Prozesse auf einer Plattform zu implementieren – vom Empfang der Daten bis zur Verarbeitung von Benutzeranfragen.
 

Für weitere Informationen,

Begrenztheit

Ein wesentlicher Nachteil von KDB+/Q ist die hohe Eintrittsschwelle. Die Sprache hat eine seltsame Syntax, einige Funktionen sind stark überladen (value hat beispielsweise etwa 11 Anwendungsfälle). Am wichtigsten ist, dass es einen radikal anderen Ansatz beim Schreiben von Programmen erfordert. In einer Vektorsprache müssen Sie immer in Array-Transformationen denken, alle Schleifen durch mehrere Varianten der Map/Reduction-Funktionen (die in Q Adverbien genannt werden) implementieren und niemals versuchen, Geld zu sparen, indem Sie Vektoroperationen durch atomare Operationen ersetzen. Um beispielsweise den Index des N-ten Vorkommens eines Elements in einem Array zu ermitteln, sollten Sie Folgendes schreiben:

1. (where element=vector)[N]  

obwohl dies für C/Java-Standards furchtbar ineffizient erscheint (= erstellt einen booleschen Vektor, der die wahren Indizes der darin enthaltenen Elemente zurückgibt). Aber diese Notation macht die Bedeutung des Ausdrucks klarer und Sie verwenden schnelle Vektoroperationen anstelle langsamer atomarer Operationen. Der konzeptionelle Unterschied zwischen einer Vektorsprache und anderen ist vergleichbar mit dem Unterschied zwischen imperativen und funktionalen Programmieransätzen, und darauf müssen Sie vorbereitet sein.
 
Einige Benutzer sind auch mit QSQL unzufrieden. Der Punkt ist, dass es nur wie echtes SQL aussieht. In Wirklichkeit handelt es sich lediglich um einen Interpreter für SQL-ähnliche Ausdrücke, der die Abfrageoptimierung nicht unterstützt. Der Benutzer muss selbst optimale Abfragen schreiben, und zwar in Q, wofür viele nicht bereit sind. Andererseits können Sie die optimale Abfrage natürlich auch immer selbst schreiben, anstatt sich auf einen Black-Box-Optimierer zu verlassen.
 
Als Pluspunkt ist ein Buch über Q – Q For Mortals kostenlos erhältlich unter WebseiteDort sind auch viele andere nützliche Materialien gesammelt.
 
Ein weiterer großer Nachteil sind die Lizenzkosten. Das sind Zehntausende Dollar pro Jahr und CPU. Solche Ausgaben können sich nur große Unternehmen leisten. Kürzlich hat KX seine Lizenzpolitik flexibler gestaltet und bietet die Möglichkeit, nur für die Nutzungsdauer zu zahlen oder KDB+ in den Google- und Amazon-Clouds zu mieten. KX bietet auch zum Download an kostenlose Version für nichtkommerzielle Zwecke (32-Bit-Version oder 64-Bit auf Anfrage).
 

Konkurrenz

Es gibt eine ganze Reihe spezialisierter Datenbanken, die auf ähnlichen Prinzipien basieren – spaltenbasiert, speicherintern und auf sehr große Datenmengen ausgerichtet. Das Problem besteht darin, dass es sich um spezialisierte Datenbanken handelt. Ein markantes Beispiel ist Clickhouse. Diese Datenbank hat ein sehr ähnliches Prinzip wie KDB+ zum Speichern von Daten auf der Festplatte und zum Erstellen eines Index; sie führt einige Abfragen schneller aus als KDB+, wenn auch nicht wesentlich. Aber selbst als Datenbank ist Clickhouse spezialisierter als KDB+ – Webanalyse vs. beliebige Zeitreihen (dieser Unterschied ist sehr wichtig – aus diesem Grund ist es in Clickhouse beispielsweise nicht möglich, die Reihenfolge von Datensätzen zu verwenden). Vor allem aber verfügt Clickhouse nicht über die Vielseitigkeit von KDB+, einer Sprache, die es ermöglichen würde, Daten direkt in der Datenbank zu verarbeiten, anstatt sie zuerst in eine separate Anwendung zu laden, beliebige SQL-Ausdrücke zu erstellen, beliebige Funktionen in einer Abfrage anzuwenden und Prozesse zu erstellen nicht im Zusammenhang mit der Ausführung historischer Datenbankfunktionen. Daher ist es schwierig, KDB+ mit anderen Datenbanken zu vergleichen; sie sind vielleicht in bestimmten Anwendungsfällen besser oder einfach besser, wenn es um klassische Datenbankaufgaben geht, aber ich kenne kein anderes ebenso effektives und vielseitiges Tool zur Verarbeitung temporärer Daten.
 

Python-Integration

Um die Verwendung von KDB+ für Personen, die mit der Technologie nicht vertraut sind, einfacher zu machen, hat KX Bibliotheken erstellt, die sich innerhalb eines einzigen Prozesses eng mit Python integrieren lassen. Sie können entweder jede Python-Funktion aus Q aufrufen oder umgekehrt – jede Q-Funktion aus Python aufrufen (insbesondere QSQL-Ausdrücke). Bibliotheken konvertieren bei Bedarf (nicht immer aus Effizienzgründen) Daten vom Format einer Sprache in das Format einer anderen. Dadurch leben Q und Python in einer so engen Symbiose, dass die Grenzen zwischen ihnen verschwimmen. Dadurch hat der Programmierer einerseits vollen Zugriff auf zahlreiche nützliche Python-Bibliotheken, andererseits erhält er eine schnelle, in Python integrierte Basis für die Arbeit mit Big Data, was besonders für diejenigen nützlich ist, die sich mit maschinellem Lernen befassen oder Modellieren.
 
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

Die Website des Unternehmens - https://kx.com/
Website für Entwickler - https://code.kx.com/v2/
Buch Q für Sterbliche (auf Englisch) - https://code.kx.com/q4m3/
Artikel zu KDB+/Q-Anwendungen von kx-Mitarbeitern - https://code.kx.com/v2/wp/

Source: habr.com

Kommentar hinzufügen