KDB+, produit de l'entreprise est une base de donnĂ©es en colonne, Ă la fois largement connue dans certains cercles et extrĂȘmement rapide, conçue pour le stockage de sĂ©ries temporelles et les calculs analytiques basĂ©s sur celles-ci. Ă l'origine, elle a rencontrĂ© (et continue de rencontrer) un immense succĂšs dans le secteur financier â les 10 plus grandes banques d'investissement et de nombreux fonds spĂ©culatifs, bourses et autres organisations l'utilisent. RĂ©cemment, KX a dĂ©cidĂ© d'Ă©largir sa clientĂšle et propose dĂ©sormais des solutions dans d'autres domaines oĂč de grandes quantitĂ©s de donnĂ©es sont ordonnĂ©es dans le temps ou d'une autre maniĂšre â tĂ©lĂ©communications, bio-informatique, fabrication, etc. Ils sont notamment devenus partenaires de l'Ă©quipe Aston Martin Red Bull Racing en Formule 1, oĂč ils aident Ă collecter et traiter les donnĂ©es des capteurs des voitures et Ă analyser les tests en soufflerie. Dans cet article, je vais raconter quelles sont les caractĂ©ristiques de KDB+ qui la rendent ultra-performante, pourquoi les entreprises sont prĂȘtes Ă dĂ©penser beaucoup d'argent pour elle et, enfin, pourquoi ce n'est en rĂ©alitĂ© pas une base de donnĂ©es.
Â

Â
Dans cet article, je vais essayer de donner un aperçu de ce qu'est KDB+, quelles possibilitĂ©s et limites elle a, et quelle est son utilitĂ© pour les entreprises souhaitant traiter de grands volumes de donnĂ©es. Je ne plongerai pas dans les dĂ©tails de la mise en Ćuvre de KDB+ ni dans ceux de son langage de programmation Q. Ces deux sujets sont trĂšs vastes et mĂ©ritent des articles sĂ©parĂ©s. On peut trouver beaucoup d'informations sur ces sujets sur le site code.kx.com, y compris un livre sur Q â Q For Mortals (voir le lien ci-dessous).
Certains termes
- Base de données en mémoire. Base de données qui stocke les données dans la mémoire vive pour accélérer l'accÚs. Les avantages de ce type de base sont évidents, mais les inconvénients incluent la possibilité de perte de données et la nécessité de disposer de beaucoup de mémoire sur le serveur.
- Base de donnĂ©es en colonne. Base de donnĂ©es oĂč les donnĂ©es sont stockĂ©es par colonnes et non par enregistrements. Le principal avantage de ce type de base est que les donnĂ©es d'une mĂȘme colonne sont stockĂ©es ensemble sur le disque et en mĂ©moire, ce qui accĂ©lĂšre considĂ©rablement leur accĂšs. Il n'est pas nĂ©cessaire de charger les colonnes qui ne sont pas utilisĂ©es dans la requĂȘte. Le principal inconvĂ©nient est qu'il est difficile de modifier et de supprimer des enregistrements.
- SĂ©rie temporelle. Les donnĂ©es avec une colonne de type date ou heure. En gĂ©nĂ©ral, pour ce type de donnĂ©es, il est important de respecter l'ordre chronologique afin de pouvoir facilement dĂ©terminer quelle entrĂ©e prĂ©cĂšde ou suit l'entrĂ©e actuelle, ou pour appliquer des fonctions dont le rĂ©sultat dĂ©pend de l'ordre des enregistrements. Les bases de donnĂ©es classiques reposent sur un principe complĂštement diffĂ©rent â la reprĂ©sentation d'un ensemble d'enregistrements comme un ensemble, oĂč l'ordre des enregistrements n'est en principe pas dĂ©fini.
- Vecteur. Dans le contexte de KDB+, c'est une liste d'Ă©lĂ©ments de type atomique unique, comme des nombres. En d'autres termes, un tableau d'Ă©lĂ©ments. Les tableaux, contrairement aux listes, peuvent ĂȘtre stockĂ©s de maniĂšre compacte et traitĂ©s Ă l'aide d'instructions vectorielles du processeur.
Â
Contexte historique
La sociĂ©tĂ© KX a Ă©tĂ© fondĂ©e en 1993 par Arthur Whitney, qui auparavant travaillait Ă la banque Morgan Stanley sur le langage A+, le successeur d'APL â un langage trĂšs original et populaire Ă l'Ă©poque dans le domaine financier. Bien sĂ»r, chez KX, Arthur a continuĂ© dans la mĂȘme veine et a créé le langage fonctionnel vectoriel K, guidĂ© par des idĂ©es de radical minimalisme. Les programmes en K ressemblent Ă un ensemble dĂ©sordonnĂ© de signes de ponctuation et de symboles spĂ©ciaux, le sens des signes et des fonctions dĂ©pend du contexte, et chaque opĂ©ration porte en elle beaucoup plus de sens que dans les langages de programmation habituels. GrĂące Ă cela, un programme en K occupe un minimum d'espace â quelques lignes peuvent remplacer des pages de texte d'un langage verbeux comme Java â et constitue une rĂ©alisation hyper-concentrĂ©e d'un algorithme.
Â
Une fonction en K implémentant la majeure partie d'un générateur de parseur LL1 selon une grammaire donnée :
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),"]";""]]}Â Â
 Cette philosophie d'extrĂȘme efficacitĂ© avec un minimum de mouvement, Arthur l'a Ă©galement incarnĂ©e dans KDB+, qui est apparue en 2003 (je pense qu'il est maintenant clair d'oĂč vient la lettre K dans le nom) et qui n'est rien d'autre qu'un interprĂ©teur de la quatriĂšme version du langage K. Au-dessus de K, une version plus agrĂ©able Ă l'Ćil appelĂ©e Q a Ă©tĂ© ajoutĂ©e. Q prend Ă©galement en charge un dialecte spĂ©cifique de SQL â QSQL, et l'interprĂ©teur prend en charge les tables en tant que type de donnĂ©es systĂšme, ainsi que les outils de gestion des tables en mĂ©moire et sur disque, etc.
Â
Ainsi, du point de vue de l'utilisateur, KDB+ est simplement un interprĂ©teur du langage Q avec prise en charge des tables et des expressions similaires Ă SQL dans le style de LINQ de C#. C'est la principale distinction de KDB+ par rapport aux autres bases de donnĂ©es et son principal avantage concurrentiel, souvent nĂ©gligĂ©. Ce nâest pas une base de donnĂ©es + un langage auxiliaire, mais un vĂ©ritable langage de programmation puissant + un support intĂ©grĂ© pour les fonctions de base de donnĂ©es. Cette distinction jouera un rĂŽle dĂ©terminant lors de l'Ă©numĂ©ration de tous les avantages de KDB+. Par exemple...
Â
Taille
Pour les normes modernes, KDB+ a une taille simplement microscopique. C'est littĂ©ralement un fichier exĂ©cutable de moins d'un mĂ©gaoctet et un petit fichier texte avec quelques fonctions systĂšme. RĂ©ellement â moins d'un mĂ©gaoctet, et pour ce programme, les entreprises paient des dizaines de milliers de dollars par an pour un processeur sur le serveur.
- Cette taille permet Ă KDB+ de fonctionner parfaitement sur n'importe quel matĂ©riel â du micro-ordinateur Pi aux serveurs avec des tĂ©raoctets de mĂ©moire. Cela nâaffecte en rien la fonctionnalitĂ© ; de plus, Q dĂ©marre instantanĂ©ment, ce qui permet de lâutiliser Ă©galement comme un langage de script.
- Avec une telle taille, l'interpréteur Q peut entiÚrement tenir dans le cache du processeur, ce qui accélÚre l'exécution des programmes.
- Avec une telle taille de fichier exécutable, le processus Q occupe trÚs peu de place en mémoire, et on peut les exécuter par centaines. De plus, si nécessaire, Q peut également gérer des dizaines ou des centaines de gigaoctets de mémoire dans le cadre d'un seul processus.
Polyvalence
Q convient parfaitement Ă une grande variĂ©tĂ© de tĂąches. Le processus Q peut servir de base de donnĂ©es historique et fournir un accĂšs rapide Ă des tĂ©raoctets d'informations. Par exemple, nous avons des dizaines de bases historiques, dont certaines contiennent plus de 100 gigaoctets de donnĂ©es non compressĂ©es pour une seule journĂ©e. Cependant, dans des limites raisonnables, une requĂȘte Ă la base sera exĂ©cutĂ©e en dizaines Ă centaines de millisecondes. En gĂ©nĂ©ral, nous avons un dĂ©lai d'attente universel pour les requĂȘtes utilisateur de 30 secondes, et ce cas se produit trĂšs rarement.
Â
Avec la mĂȘme aisance, Q peut ĂȘtre une base de donnĂ©es en mĂ©moire. L'ajout de nouvelles donnĂ©es aux tables en mĂ©moire se fait si rapidement que le facteur limitant est les requĂȘtes des utilisateurs. Les donnĂ©es dans les tables sont stockĂ©es par colonnes, ce qui signifie que toute opĂ©ration sur une colonne utilisera pleinement le cache du processeur. De plus, dans KX, nous avons essayĂ© de rĂ©aliser toutes les opĂ©rations de base comme les opĂ©rations arithmĂ©tiques via des instructions vectorielles du processeur, maximisant leur vitesse. Q peut Ă©galement effectuer des tĂąches non typiques des bases de donnĂ©es â par exemple, traiter des donnĂ©es en streaming et calculer en « temps rĂ©el » (avec un dĂ©lai de plusieurs dizaines de millisecondes Ă quelques secondes selon la tĂąche) diverses fonctions d'agrĂ©gation pour des instruments financiers sur diffĂ©rents intervalles de temps, ou construire un modĂšle d'impact d'une transaction rĂ©alisĂ©e sur le marchĂ© et en effectuer le profilage presque immĂ©diatement aprĂšs son exĂ©cution. Dans ce type de tĂąches, c'est souvent la nĂ©cessitĂ© de synchroniser des donnĂ©es provenant de diffĂ©rentes sources qui occasionne le principal dĂ©lai. Une grande rapiditĂ© est atteinte grĂące au fait que les donnĂ©es et les fonctions qui les traitent se trouvent dans un mĂȘme processus, et le traitement se rĂ©sume Ă l'exĂ©cution de plusieurs expressions QSQL et de jointures, qui ne sont pas interprĂ©tĂ©es mais exĂ©cutĂ©es en code binaire.
Â
Enfin, il est possible d'Ă©crire n'importe quel processus de service sur Q. Par exemple, des processus Gateway qui distribuent automatiquement les requĂȘtes des utilisateurs aux bases de donnĂ©es et serveurs appropriĂ©s. Le programmeur a une totale libertĂ© pour ŃĐ”Đ°Đ»ĐžĐ·ĐŸĐČаŃŃ n'importe quel algorithme pour la rĂ©partition, la priorisation, la tolĂ©rance aux pannes, les droits d'accĂšs, les quotas et tout ce qui lui plaĂźt. Le principal problĂšme ici est qu'il faudra tout cela implĂ©menter soi-mĂȘme.
Â
à titre d'exemple, je vais énumérer les types de processus que nous avons. Tous sont utilisés activement et travaillent ensemble, unissant en un tout des dizaines de bases différentes, traitant des données provenant de multiples sources et servant des centaines d'utilisateurs et d'applications.
- Connecteurs (feedhandler) aux sources de donnĂ©es. Ces processus utilisent gĂ©nĂ©ralement des bibliothĂšques externes, qui sont chargĂ©es dans Q. L'interface C en Q est extrĂȘmement simple et permet de crĂ©er sans effort des fonctions proxy pour n'importe quelle bibliothĂšque C/C++. Q est suffisamment rapide pour gĂ©rer, par exemple, le traitement des flux de messages FIX de toutes les bourses europĂ©ennes en mĂȘme temps.
- Distributeurs de donnĂ©es (tickerplant), qui servent de lien intermĂ©diaire entre les connecteurs et les consommateurs. En mĂȘme temps, ils Ă©crivent les donnĂ©es entrantes dans un journal binaire spĂ©cial, assurant la rĂ©silience des consommateurs face aux pertes de connexion ou aux redĂ©marrages.
- Bases de données en mémoire (rdb). Ces bases offrent un accÚs trÚs rapide aux données brutes fraßches, les stockant en mémoire. En général, elles accumulent des données dans des tables tout au long de la journée et les réinitialisent la nuit.
- Bases de données persistantes (pdb). Ces bases permettent de conserver les données de la journée en base historique. En général, contrairement aux rdb, elles ne stockent pas les données en mémoire, mais utilisent un cache spécial sur disque pendant la journée et copient les données à minuit dans la base historique.
- Bases de donnĂ©es historiques (hdb). Ces bases permettent d'accĂ©der aux donnĂ©es des jours, mois et annĂ©es prĂ©cĂ©dents. Leur taille (en jours) est limitĂ©e uniquement par la capacitĂ© des disques durs. Les donnĂ©es peuvent ĂȘtre situĂ©es n'importe oĂč, notamment sur diffĂ©rents disques pour accĂ©lĂ©rer l'accĂšs. Il est possible de compresser les donnĂ©es en utilisant plusieurs algorithmes Ă choix. La structure de la base est bien documentĂ©e et simple, les donnĂ©es Ă©tant stockĂ©es colonne par colonne dans des fichiers ordinaires, ce qui permet de les traiter, y compris Ă l'aide des outils du systĂšme d'exploitation.
- Bases de données avec informations agrégées. Elles stockent diverses agrégations, généralement groupées par nom d'instrument et intervalle de temps. Les bases en mémoire mettent à jour leur état à chaque message entrant, tandis que les historiques conservent les données précalculées pour accélérer l'accÚs aux données historiques.
- Enfin, processus gateway, qui prennent en charge des applications et des utilisateurs. Q permet une gestion entiĂšrement asynchrone des messages entrants, leur rĂ©partition dans des bases de donnĂ©es, la vĂ©rification des droits d'accĂšs, etc. Je souligne que les messages ne sont pas limitĂ©s et ne sont souvent pas des expressions SQL, comme c'est le cas dans d'autres bases de donnĂ©es. Le plus souvent, l'expression SQL est cachĂ©e dans une fonction spĂ©ciale et est construite en fonction des paramĂštres demandĂ©s par l'utilisateur â il y a conversion de temps, filtrage, les donnĂ©es sont normalisĂ©es (par exemple, le prix des actions est ajustĂ© en cas de versement de dividendes), etc.
Architecture typique pour un type de données :

Vitesse
Bien que Q soit un langage interprĂ©tĂ©, c'est aussi un langage vectoriel. Cela signifie que de nombreuses fonctions intĂ©grĂ©es, en particulier arithmĂ©tiques, acceptent des arguments de toute forme â nombres, vecteurs, matrices, listes, et l'on s'attend Ă ce que le programmeur rĂ©alise le programme comme des opĂ©rations sur des tableaux. Dans un tel langage, si vous additionnez deux vecteurs de un million d'Ă©lĂ©ments, il n'a plus d'importance que le langage soit interprĂ©tĂ©, l'addition sera effectuĂ©e par une fonction binaire ultra-optimisĂ©e. Ătant donnĂ© que la majoritĂ© du temps dans les programmes Q est consacrĂ©e aux opĂ©rations sur les tables utilisant ces fonctions vectorisĂ©es de base, nous avons une vitesse de fonctionnement trĂšs dĂ©cente, permettant de traiter d'Ă©normes volumes de donnĂ©es mĂȘme dans un seul processus. C'est comparable aux bibliothĂšques mathĂ©matiques en Python â bien que Python soit un langage plutĂŽt lent, il existe de nombreuses bibliothĂšques excellentes comme numpy, qui permettent de traiter des donnĂ©es numĂ©riques Ă la vitesse d'un langage compilĂ© (au fait, numpy est idĂ©ologiquement proche de Q).
Â
En outre, KX a portĂ© une attention particuliĂšre Ă la conception des tables et Ă l'optimisation de leur utilisation. Tout d'abord, plusieurs types d'index sont supportĂ©s, qui sont pris en charge par des fonctions intĂ©grĂ©es et peuvent ĂȘtre appliquĂ©s non seulement aux colonnes des tables, mais aussi Ă n'importe quels vecteurs â regroupement, tri, attribut d'unicitĂ© et regroupement spĂ©cial pour les bases de donnĂ©es historiques. L'index est appliquĂ© de maniĂšre Ă©lĂ©mentaire et est automatiquement ajustĂ© lors de l'ajout d'Ă©lĂ©ments dans une colonne/vecteur. Les index peuvent ĂȘtre appliquĂ©s avec succĂšs aux colonnes des tables tant en mĂ©moire qu sur disque. Lors de l'exĂ©cution d'une requĂȘte QSQL, les index sont utilisĂ©s automatiquement si possible. DeuxiĂšmement, le travail avec des donnĂ©es historiques se fait Ă travers un mĂ©canisme de mappage de fichiers du systĂšme d'exploitation (memory map). De grandes tables ne sont jamais chargĂ©es en mĂ©moire, au lieu de cela, les colonnes nĂ©cessaires sont directement mappĂ©es en mĂ©moire et seule la partie qui est rĂ©ellement nĂ©cessaire (ce qui est aidĂ© notamment par les index) est chargĂ©e. Pour le programmeur, il n'y a pas de diffĂ©rence entre les donnĂ©es Ă©tant en mĂ©moire ou non, le mĂ©canisme de travail avec mmap est entiĂšrement cachĂ© dans les entrailles de Q.
Â
KDB+ est une base de donnĂ©es non relationnelle, les tables peuvent contenir des donnĂ©es arbitraires, tout en maintenant l'ordre des lignes dans la table lors de l'ajout de nouveaux Ă©lĂ©ments, ce qui doit ĂȘtre utilisĂ© lors de l'Ă©criture de requĂȘtes. Cette caractĂ©ristique est particuliĂšrement nĂ©cessaire pour le travail avec des sĂ©ries temporelles (donnĂ©es boursiĂšres, tĂ©lĂ©mĂ©trie, journaux d'Ă©vĂ©nements), car si les donnĂ©es sont triĂ©es par le temps, l'utilisateur n'a pas besoin d'appliquer des astuces SQL pour trouver dans la table la premiĂšre ou la derniĂšre ligne temporelle ou N lignes, dĂ©terminer quelle ligne suit la N-Ăšme ligne, etc. Les jointures de tables sont encore plus simplifiĂ©es, par exemple, trouver pour 16000 transactions VOD.L (Vodafone) le dernier cours dans une table de 500 millions d'Ă©lĂ©ments prend environ une seconde sur le disque et une dizaine de millisecondes en mĂ©moire.
Â
Un exemple de jointure par le temps â la table des quotes est mappĂ©e en mĂ©moire, donc il n'est pas nĂ©cessaire de spĂ©cifier VOD.L dans le where, on utilise implicitement l'index sur la colonne sym et le fait que les donnĂ©es sont triĂ©es par le temps. Presque toutes les jointures dans Q sont des fonctions ordinaires, et non pas une partie de l'expression select :
1. aj[`sym`time;select from trade where date=2019.03.26, sym=`VOD.L;select from quote where date=2019.03.26]Â Â
Enfin, il convient de noter que les ingĂ©nieurs de KX, Ă commencer par Arthur Whitney lui-mĂȘme, sont rĂ©ellement obsĂ©dĂ©s par l'efficacitĂ© et font tout pour tirer le meilleur parti des fonctionnalitĂ©s standard de Q et optimiser les modĂšles d'utilisation les plus courants.
Â
Conclusion
KDB+ est populaire auprĂšs des entreprises principalement en raison de sa polyvalence exceptionnelle â elle fonctionne aussi bien comme base de donnĂ©es en mĂ©moire que comme base de stockage de tĂ©raoctets de donnĂ©es historiques, ainsi que comme plateforme d'analyse de donnĂ©es. GrĂące au traitement des donnĂ©es directement dans la base, une grande rapiditĂ© et des Ă©conomies de ressources sont rĂ©alisĂ©es. Un langage de programmation complet, intĂ©grĂ© aux fonctions de la base de donnĂ©es, permet de rĂ©aliser sur une seule plateforme l'ensemble des processus nĂ©cessaires â de l'acquisition de donnĂ©es Ă la traitement des requĂȘtes des utilisateurs.
Â
Informations supplémentaires
Inconvénients
Un inconvĂ©nient majeur de KDB+/Q est la haute barriĂšre d'entrĂ©e. Le langage a une syntaxe Ă©trange, certaines fonctions sont fortement surchargĂ©es (par exemple, value a environ 11 usages diffĂ©rents). Surtout, il nĂ©cessite une approche radicalement diffĂ©rente de l'Ă©criture de programmes. Dans un langage vectoriel, il faut constamment penser en termes de transformations de tableaux, tous les boucles doivent ĂȘtre mises en Ćuvre via plusieurs variantes des fonctions map/reduce (appelĂ©es adverbs dans Q), et il ne faut jamais essayer d'Ă©conomiser en remplaçant des opĂ©rations vectorielles par des opĂ©rations atomiques. Par exemple, pour trouver l'index de la N-iĂšme occurrence d'un Ă©lĂ©ment dans un tableau, on doit Ă©crire :
1. (where element=vector)[N]Â Â
bien que cela semble terriblement inefficace selon les normes de C/Java (= cela crĂ©e un vecteur boolĂ©en, oĂč where retourne les indices des Ă©lĂ©ments true dans celui-ci). Mais cette rĂ©daction rend le sens de l'expression plus clair et vous utilisez des opĂ©rations vectorielles rapides au lieu d'opĂ©rations atomiques lentes. La diffĂ©rence conceptuelle entre un langage vectoriel et les autres est comparable Ă la diffĂ©rence entre les approches impĂ©rative et fonctionnelle en programmation, et il faut s'y prĂ©parer.
Â
Certains utilisateurs peuvent Ă©galement ĂȘtre mĂ©contents de QSQL. En effet, il ressemble seulement Ă un vrai SQL. En rĂ©alitĂ©, il s'agit simplement d'un interprĂ©teur d'expressions SQL-like qui ne prend pas en charge l'optimisation des requĂȘtes. L'utilisateur doit lui-mĂȘme Ă©crire des requĂȘtes optimales, ce qui n'est pas Ă la portĂ©e de tout le monde. D'un autre cĂŽtĂ©, il est toujours possible d'Ă©crire soi-mĂȘme une requĂȘte optimale, plutĂŽt que de compter sur une boĂźte noire d'optimisation.
Â
Un point positif est que le livre sur Q â Q For Mortals est disponible gratuitement sur , oĂč de nombreux autres matĂ©riels utiles sont Ă©galement rassemblĂ©s.
Â
Un autre gros inconvénient est le coût de la licence. Cela représente des dizaines de milliers de dollars par an pour un CPU. Seules de grandes entreprises peuvent se permettre de telles dépenses. Récemment, KX a rendu sa politique de licence plus flexible et permet de payer uniquement pour le temps d'utilisation ou de louer KDB+ dans les nuages de Google et Amazon. KX propose également un téléchargement. (version 32 bits ou 64 bits sur demande).
Â
Concurrents
Il existe de nombreuses bases de donnĂ©es spĂ©cialisĂ©es, construites sur des principes similaires : colonnes, en mĂ©moire, et orientĂ©es vers de trĂšs grands volumes de donnĂ©es. Le problĂšme est qu'il s'agit prĂ©cisĂ©ment de bases de donnĂ©es spĂ©cialisĂ©es. Un exemple marquant est Clickhouse. Cette base de donnĂ©es partage un principe de stockage des donnĂ©es sur disque et de construction d'index semblable Ă celui de KDB+, certains de ses requĂȘtes sont exĂ©cutĂ©es plus rapidement que celles de KDB+, bien que cela ne soit pas significatif. Mais mĂȘme en tant que base de donnĂ©es, Clickhouse est plus spĂ©cialisĂ©e que KDB+ â analyse web contre sĂ©ries temporelles arbitraires (cette distinction est trĂšs importante, car c'est pour cela, par exemple, qu'il n'est pas possible d'utiliser l'ordre des enregistrements dans Clickhouse). Cependant, l'essentiel est que Clickhouse ne possĂšde pas l'universalitĂ© de KDB+, le langage qui permettrait de traiter les donnĂ©es directement dans la base, sans les charger au prĂ©alable dans une application distincte, de construire des expressions SQL arbitraires, d'appliquer des fonctions personnalisĂ©es dans la requĂȘte, et de crĂ©er des processus non liĂ©s Ă l'exĂ©cution des fonctions de la base historique. Par consĂ©quent, il est difficile de comparer KDB+ avec d'autres bases, celles-ci peuvent ĂȘtre meilleures dans certains scĂ©narios d'utilisation ou simplement meilleures pour des tĂąches de bases de donnĂ©es classiques, mais je ne connais pas d'autre outil aussi efficace et universel pour le traitement des donnĂ©es temporelles.
Â
Intégration avec Python
Pour simplifier le travail avec KDB+ pour les personnes peu familiĂšres avec la technologie, KX a créé des bibliothĂšques pour une intĂ©gration Ă©troite avec Python dans un mĂȘme processus. Il est possible d'appeler n'importe quelle fonction Python depuis Q, et inversement, d'appeler n'importe quelle fonction Q depuis Python (en particulier, des expressions QSQL). Les bibliothĂšques convertissent les donnĂ©es du format d'un langage au format de l'autre, si nĂ©cessaire (pour l'efficacitĂ©, ce n'est pas toujours le cas). En consĂ©quence, Q et Python vivent dans un tel symbiose Ă©troite que les frontiĂšres entre eux s'effacent. Ainsi, le programmeur a, d'un cĂŽtĂ©, un accĂšs complet Ă de nombreuses bibliothĂšques utiles de Python, et de l'autre, il dispose d'une base rapide intĂ©grĂ©e Ă Python pour travailler avec de grandes quantitĂ©s de donnĂ©es, ce qui est particuliĂšrement utile pour ceux qui s'occupent d'apprentissage automatique ou de modĂ©lisation.
Â
Travailler avec Q dans 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')Â Â
Liens
Site de l'entreprise â
Site pour dĂ©veloppeurs â
Livre Q For Mortals (en anglais) â
Articles sur les applications de KDB+/Q par des employĂ©s de kx â
Source : habr.com
