KDB+ gagnagrunnur: frá fjármálum til Formúlu 1

KDB+, fyrirtækisvara KX er víða þekktur í þröngum hringjum, afar hraðvirkur, dálkalaga gagnagrunnur sem er hannaður til að geyma tímaraðir og greiningarútreikninga á þeim. Upphaflega var (og er) mjög vinsælt í fjármálageiranum - allir topp 10 fjárfestingarbankarnir og margir þekktir vogunarsjóðir, kauphallir og aðrar stofnanir nota það. Nýlega ákvað KX að stækka viðskiptavinahóp sinn og bjóða nú upp á lausnir á öðrum sviðum þar sem mikið magn gagna er, skipulagt eftir tíma eða öðru - fjarskiptum, lífupplýsingafræði, framleiðslu o.fl. Þeir urðu einnig félagar í Aston Martin Red Bull Racing liðinu í Formúlu 1, þar sem þeir aðstoða við að safna og vinna úr gögnum frá bílskynjurum og greina vindgönguprófanir. Í þessari grein vil ég segja þér hvaða eiginleikar KDB+ gera það afkastamikið, hvers vegna fyrirtæki eru tilbúin að eyða miklum peningum í það og að lokum, hvers vegna það er í raun ekki gagnagrunnur.
 
KDB+ gagnagrunnur: frá fjármálum til Formúlu 1
 
Í þessari grein mun ég reyna að segja þér almennt hvað KDB+ er, hvaða getu og takmarkanir það hefur og hver ávinningur þess er fyrir fyrirtæki sem vilja vinna mikið magn af gögnum. Ég mun ekki fara í smáatriðin um innleiðingu KDB+ eða upplýsingar um Q forritunarmál þess. Bæði þessi efni eru mjög víðtæk og eiga skilið aðskildar greinar. Margar upplýsingar um þessi efni er að finna á code.kx.com, þar á meðal bók um Q - Q For Mortals (sjá tengil hér að neðan).

Nokkur hugtök

  • Gagnagrunnur í minni. Gagnagrunnur sem geymir gögn í vinnsluminni fyrir hraðari aðgang. Kostir slíks gagnagrunns eru augljósir en gallarnir eru möguleiki á gagnatapi og þörf á að hafa mikið minni á þjóninum.
  • Dálkagagnagrunnur. Gagnagrunnur þar sem gögn eru geymd dálk fyrir dálk frekar en skrá fyrir skrá. Helsti kosturinn við slíkan gagnagrunn er að gögn úr einum dálki eru geymd saman á diski og í minni sem flýtir verulega fyrir aðgangi að þeim. Það er engin þörf á að hlaða dálkum sem eru ekki notaðir í fyrirspurninni. Helsti ókosturinn er sá að erfitt er að breyta og eyða skrám.
  • Tímaröð. Gögn með dagsetningar- eða tímadálki. Venjulega er tímaröðun mikilvæg fyrir slík gögn, svo að þú getir auðveldlega ákvarðað hvaða skrá kemur á undan eða á eftir núverandi, eða til að beita aðgerðum þar sem niðurstöður eru háðar röð skránna. Klassískir gagnagrunnar eru byggðir á allt annarri meginreglu - tákna safn gagna sem safn, þar sem röð gagna er í grundvallaratriðum ekki skilgreind.
  • Vektor. Í samhengi við KDB+ er þetta listi yfir frumefni af sömu atómgerð, til dæmis tölur. Með öðrum orðum, fjölda þátta. Fylki, ólíkt listum, er hægt að geyma þétt og vinna með því að nota vektorörgjörvaleiðbeiningar.

 

Saga

KX var stofnað árið 1993 af Arthur Whitney, sem áður starfaði hjá Morgan Stanley banka við A+ tungumálið, arftaka APL - mjög frumlegt og á sínum tíma vinsælt tungumál í fjármálaheiminum. Auðvitað, í KX, hélt Arthur áfram í sama anda og skapaði vektorvirka tungumálið K, með hugmyndum róttæks naumhyggju að leiðarljósi. K forrit líta út eins og hrærigrautur af greinarmerkjum og sérstöfum, merking tákna og falla fer eftir samhenginu og hver aðgerð hefur miklu meiri merkingu en hún gerir í hefðbundnum forritunarmálum. Vegna þessa tekur K forrit lágmarks pláss - nokkrar línur geta komið í stað textasíður á orðræðu tungumáli eins og Java - og er ofursamþjöppuð útfærsla á reikniritinu.
 
Fall í K sem útfærir megnið af LL1 flokkunarrafallinu samkvæmt tiltekinni málfræði:

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 útfærði þessa hugmyndafræði um mikla hagkvæmni með lágmarks líkamshreyfingum í KDB+, sem birtist árið 2003 (ég held að það sé nú ljóst hvaðan bókstafurinn K í nafninu kemur) og er ekkert annað en túlkandi fjórðu útgáfu K. tungumál. Notendavænni útgáfu hefur verið bætt ofan á K K sem kallast Q. Q bætti einnig við stuðningi við ákveðna mállýsku af SQL - QSQL, og túlkurinn - stuðningur við töflur sem kerfisgagnategund, verkfæri til að vinna með töflur í minni og á diski o.s.frv.
 
Þannig að frá sjónarhóli notanda er KDB+ einfaldlega Q tungumálatúlkur með stuðningi fyrir töflur og SQL-líkar LINQ-stíl tjáningar frá C#. Þetta er mikilvægasti munurinn á KDB+ og öðrum gagnagrunnum og helsta samkeppnisforskot þess, sem oft er gleymt. Þetta er ekki gagnagrunnur + óvirkt hjálpartungumál, heldur fullkomið öflugt forritunarmál + innbyggður stuðningur við gagnagrunnsaðgerðir. Þessi aðgreining mun gegna afgerandi hlutverki við að skrá alla kosti KDB+. Til dæmis…
 

Stærð

Samkvæmt nútíma stöðlum er KDB+ einfaldlega smásæ að stærð. Það er bókstaflega ein undirmegabæta keyranleg skrá og ein lítil textaskrá með sumum kerfisaðgerðum. Í raun og veru - minna en eitt megabæti, og fyrir þetta forrit borga fyrirtæki tugi þúsunda dollara á ári fyrir einn örgjörva á þjóninum.

  • Þessi stærð gerir KDB+ kleift að líða vel á hvaða vélbúnaði sem er - allt frá Pi örtölvu til netþjóna með terabæta af minni. Þetta hefur ekki áhrif á virknina á nokkurn hátt, þar að auki byrjar Q samstundis, sem gerir það kleift að nota það meðal annars sem forskriftarmál.
  • Í þessari stærð passar Q túlkurinn alfarið inn í skyndiminni örgjörva, sem flýtir fyrir framkvæmd forrita.
  • Með þessari stærð af keyrsluskránni tekur Q ferlið óverulegt pláss í minni; þú getur keyrt hundruð þeirra. Þar að auki, ef nauðsyn krefur, getur Q starfað með tugum eða hundruðum gígabæta af minni í einu ferli.

Fjölhæfni

Q er frábært fyrir fjölbreytt úrval af forritum. Process Q getur virkað sem sögulegur gagnagrunnur og veitt skjótan aðgang að terabætum af upplýsingum. Til dæmis höfum við heilmikið af sögulegum gagnagrunnum, í sumum þeirra tekur einn óþjappaður dagur af gögnum meira en 100 gígabæt. Hins vegar, með eðlilegum takmörkunum, verður fyrirspurn í gagnagrunninn lokið á tugum til hundruðum millisekúndna. Almennt séð höfum við alhliða tímamörk fyrir notendabeiðnir - 30 sekúndur - og það virkar mjög sjaldan.
 
Q gæti alveg eins verið gagnagrunnur í minni. Nýjum gögnum er bætt við töflur í minni svo fljótt að notendabeiðnir eru takmarkandi þátturinn. Gögn í töflum eru geymd í dálkum, sem þýðir að allar aðgerðir á dálki munu nota skyndiminni örgjörva á fullri afköstum. Auk þessa reyndi KX að innleiða allar grunnaðgerðir eins og reikning í gegnum vektorleiðbeiningar örgjörvans og hámarka hraða þeirra. Q getur líka framkvæmt verkefni sem eru ekki dæmigerð fyrir gagnagrunna - td unnið úr streymigögnum og reiknað í „rauntíma“ (með töf frá tugum millisekúndna í nokkrar sekúndur eftir verkefninu) ýmsar samsöfnunaraðgerðir fyrir fjármálagerninga fyrir mismunandi tíma millibili eða smíða líkan af áhrifum fullkominna viðskipta á markaðinn og framkvæma prófílgreiningu þess nánast strax eftir að þeim lýkur. Í slíkum verkefnum er helsta töfin oftast ekki Q, heldur þörfin á að samstilla gögn frá mismunandi aðilum. Mikill hraði næst vegna þess að gögnin og aðgerðirnar sem vinna úr þeim eru í einu ferli og vinnslan minnkar niður í að keyra nokkrar QSQL tjáningar og joins, sem eru ekki túlkaðar, en eru keyrðar með tvíundarkóða.
 
Að lokum geturðu skrifað hvaða þjónustuferli sem er í Q. Til dæmis, Gateway ferli sem dreifa notendabeiðnum sjálfkrafa til nauðsynlegra gagnagrunna og netþjóna. Forritarinn hefur algjört frelsi til að innleiða hvaða reiknirit sem er fyrir jafnvægi, forgangsröðun, bilanaþol, aðgangsrétt, kvóta og eiginlega allt annað sem hjartað þráir. Helsta vandamálið hér er að þú verður að útfæra allt þetta sjálfur.
 
Sem dæmi mun ég skrá hvaða tegundir ferla við höfum. Öll eru þau notuð á virkan hátt og vinna saman, sameina tugi mismunandi gagnagrunna í einn, vinna úr gögnum frá mörgum aðilum og þjóna hundruðum notenda og forrita.

  • Tengi (feedhandler) við gagnaveitur. Þessi ferli nota venjulega ytri bókasöfn sem eru hlaðin inn í Q. C viðmótið í Q er afar einfalt og gerir þér kleift að búa til umboðsaðgerðir fyrir hvaða C/C++ bókasafn sem er. Q er nógu hratt til að takast á við, til dæmis, að vinna úr flóði af FIX skilaboðum frá öllum evrópskum kauphöllum samtímis.
  • Gagnadreifingaraðilar (tickerplant), sem þjóna sem millitengi milli tengi og neytenda. Á sama tíma skrifa þeir gögn sem berast í sérstakan tvíundarskrá, sem veitir neytendum styrkleika gegn tengingarmissi eða endurræsingu.
  • Gagnagrunnur í minni (rdb). Þessir gagnagrunnar veita hraðasta mögulega aðgang að hráum, ferskum gögnum með því að geyma þau í minni. Venjulega safna þeir gögnum í töflur á daginn og endurstilla þau á nóttunni.
  • Viðvarandi gagnagrunnur (pdb). Þessir gagnagrunnar tryggja að gögn í dag séu geymd í sögulegum gagnagrunni. Að jafnaði, ólíkt rdb, geyma þeir ekki gögn í minni, heldur nota sérstakt skyndiminni á diski á daginn og afrita gögnin á miðnætti í sögulega gagnagrunninn.
  • Sögulegir gagnagrunnar (hdb). Þessir gagnagrunnar veita aðgang að gögnum fyrir fyrri daga, mánuði og ár. Stærð þeirra (í dögum) takmarkast aðeins af stærð harða diskanna. Gögn geta verið staðsett hvar sem er, sérstaklega á mismunandi diskum til að flýta fyrir aðgangi. Það er hægt að þjappa gögnum með nokkrum reikniritum til að velja úr. Uppbygging gagnagrunnsins er vel skjalfest og einföld, gögnin eru geymd dálk fyrir dálk í venjulegum skrám, svo hægt er að vinna úr þeim, meðal annars með stýrikerfinu.
  • Gagnasöfn með uppsöfnuðum upplýsingum. Þeir geyma ýmsar samansafnanir, venjulega með, flokkaðar eftir hljóðfærisheiti og tímabili. Gagnagrunnar í minni uppfæra ástand sitt með hverjum skilaboðum sem berast og sögulegir gagnagrunnar geyma fyrirfram reiknuð gögn til að flýta fyrir aðgangi að sögulegum gögnum.
  • Að lokum er gáttarferliþjónusta forrit og notendur. Q gerir þér kleift að innleiða algjörlega ósamstillta vinnslu á skilaboðum sem berast, dreifa þeim yfir gagnagrunna, athuga aðgangsrétt o.s.frv. Athugaðu að skilaboð eru ekki takmörkuð og eru oftast ekki SQL tjáning eins og er í öðrum gagnagrunnum. Algengast er að SQL tjáningin er falin í sérstakri aðgerð og er smíðað út frá þeim breytum sem notandinn biður um - tími er umreiknaður, síaður, gögn eru eðlileg (til dæmis er hlutabréfaverð jafnað ef arður var greiddur) o.s.frv.

Dæmigert arkitektúr fyrir eina gagnategund:

KDB+ gagnagrunnur: frá fjármálum til Formúlu 1

Speed

Þó Q sé túlkað tungumál er það líka vektormál. Þetta þýðir að margar innbyggðar aðgerðir, sérstaklega reikningsgreinar, taka hvaða form sem er - tölur, vektorar, fylki, listar - og ætlast er til að forritarinn útfæri forritið sem fylkisaðgerðir. Í slíku tungumáli, ef þú bætir við tveimur vektorum af milljón þáttum, skiptir ekki lengur máli að tungumálið sé túlkað, samlagningin verður framkvæmd með ofurbjartsýni tvíundarfalls. Þar sem ljónahluti tímans í Q forritum fer í aðgerðir með töflum sem nota þessar grunnvökruðu aðgerðir, er framleiðslan mjög þokkalegur rekstrarhraði, sem gerir okkur kleift að vinna mikið magn af gögnum jafnvel í einu ferli. Þetta er svipað og stærðfræðisöfn í Python - þó Python sjálft sé mjög hægt tungumál, þá hefur það mörg frábær bókasöfn eins og numpy sem gera þér kleift að vinna úr tölulegum gögnum á hraða samsetts tungumáls (við the vegur, numpy er hugmyndafræðilega nálægt Q ).
 
Auk þess fór KX mjög varlega í að hanna töflur og hagræða vinnu með þær. Í fyrsta lagi eru nokkrar tegundir af vísitölum studdar, sem eru studdar af innbyggðum aðgerðum og hægt er að nota þær ekki aðeins á töfludálka, heldur einnig á hvaða vektora sem er - flokkun, flokkun, sérstöðueiginleika og sérstaka flokkun fyrir sögulega gagnagrunna. Vísitalan er notuð á einfaldan hátt og er sjálfkrafa leiðrétt þegar þáttum er bætt við dálkinn/vigorinn. Vísitölur geta jafn vel verið beitt á töfludálka bæði í minni og á diski. Þegar QSQL fyrirspurn er keyrð eru vísitölur notaðar sjálfkrafa ef mögulegt er. Í öðru lagi er unnið með söguleg gögn í gegnum vélbúnaðinn til að sýna OS skrár (minniskort). Stórar töflur eru aldrei hlaðnar inn í minnið heldur eru nauðsynlegir dálkar kortlagðir beint inn í minnið og aðeins sá hluti þeirra er í raun hlaðinn (vísitölur hjálpa líka hér) sem þarf. Það skiptir ekki máli fyrir forritarann ​​hvort gögnin eru í minni eða ekki; vélbúnaðurinn til að vinna með mmap er algjörlega falinn í djúpum Q.
 
KDB+ er ekki tengslagagnagrunnur; töflur geta innihaldið handahófskennd gögn á meðan röð lína í töflunni breytist ekki þegar nýjum þáttum er bætt við og má og ætti að nota þegar fyrirspurnir eru skrifaðar. Þessi eiginleiki er bráðnauðsynlegur til að vinna með tímaraðir (gögn frá kauphöllum, fjarmælingum, atburðaskrám), því ef gögnin eru flokkuð eftir tíma, þá þarf notandinn ekki að nota nein SQL brellur til að finna fyrstu eða síðustu línuna eða N raðir í töflunni , ákvarða hvaða lína fylgir Nth línu o.s.frv. Töflutengingar eru einfaldaðar enn frekar, til dæmis að finna síðustu tilboðið fyrir 16000 VOD.L (Vodafone) færslur í töflu með 500 milljón þáttum tekur um sekúndu á diski og tugir millisekúndna í minni.
 
Dæmi um tímatengingu - tilvitnunartaflan er varpað í minni, svo það er engin þörf á að tilgreina VOD.L í hvar, vísitalan á sym dálknum og sú staðreynd að gögnin eru flokkuð eftir tíma eru óbeint notuð. Næstum allar joins í Q eru venjulegar aðgerðir, ekki hluti af vali tjáningu:

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

Að lokum er rétt að taka fram að verkfræðingarnir hjá KX, sem byrja á Arthur Whitney sjálfum, eru sannarlega uppteknir af hagkvæmni og leggja sig fram um að ná sem mestum árangri í stöðluðum eiginleikum Q og hámarka algengustu notkunarmynstur.
 

Samtals

KDB+ er vinsælt meðal fyrirtækja fyrst og fremst vegna einstakrar fjölhæfni þess - það þjónar jafn vel sem gagnagrunnur í minni, sem gagnagrunnur til að geyma terabæta af sögulegum gögnum og sem vettvangur fyrir gagnagreiningu. Vegna þess að gagnavinnsla á sér stað beint í gagnagrunninum næst mikill vinnuhraði og auðlindasparnaður. Fullbúið forritunarmál samþætt gagnagrunnsaðgerðum gerir þér kleift að innleiða allan bunkann af nauðsynlegum ferlum á einum vettvangi - frá því að taka á móti gögnum til að vinna úr notendabeiðnum.
 

Fyrir frekari upplýsingar,

Takmarkanir

Verulegur ókostur við KDB+/Q er hár aðgangsþröskuldur. Tungumálið hefur undarlega setningafræði, sumar aðgerðir eru mikið ofhlaðnar (gildi hefur til dæmis um 11 notkunartilvik). Mikilvægast er að það krefst róttækrar annarrar nálgunar við að skrifa forrit. Í vektormáli verður þú alltaf að hugsa út frá fylkisumbreytingum, útfæra allar lykkjur í gegnum nokkur afbrigði af korta-/minnkunaraðgerðum (sem eru kölluð atviksorð í Q) og aldrei reyna að spara peninga með því að skipta út vektoraðgerðum fyrir atómaðgerðir. Til dæmis, til að finna vísitöluna fyrir N. tilvik staks í fylki, ættir þú að skrifa:

1. (where element=vector)[N]  

þó að þetta virðist hræðilega óhagkvæmt miðað við C/Java staðla (= býr til boolean vektor, þar sem skilar raunverulegum vísitölum þáttanna í honum). En þessi merking gerir merkingu tjáningarinnar skýrari og þú notar hraðvirkar vektoraðgerðir í stað hægfara atómaðgerða. Huglægi munurinn á vektormáli og öðrum er sambærilegur við muninn á nauðsynlegum og hagnýtum aðferðum við forritun og þú þarft að vera tilbúinn fyrir þetta.
 
Sumir notendur eru líka óánægðir með QSQL. Málið er að það lítur aðeins út eins og alvöru SQL. Í raun og veru er það bara túlkur á SQL-líkum tjáningum sem styður ekki fínstillingu fyrirspurna. Notandinn verður að skrifa bestu fyrirspurnir sjálfur og í Q, sem margir eru ekki tilbúnir í. Á hinn bóginn geturðu auðvitað alltaf skrifað bestu fyrirspurnina sjálfur, frekar en að treysta á fínstillingu svarta kassans.
 
Auk þess er bók um Q - Q For Mortals fáanleg ókeypis á heimasíðu fyrirtækisins, það er líka mikið af öðru gagnlegu efni safnað þar.
 
Annar stór ókostur er kostnaður við leyfið. Það eru tugþúsundir dollara á ári á hvern örgjörva. Aðeins stór fyrirtæki hafa efni á slíkum kostnaði. Nýlega hefur KX gert leyfisveitingarstefnu sína sveigjanlegri og gefur tækifæri til að greiða aðeins fyrir notkunartímann eða leigja KDB+ í Google og Amazon skýjunum. KX býður einnig upp á niðurhal ókeypis útgáfa ekki í viðskiptalegum tilgangi (32 bita útgáfa eða 64 bita eftir beiðni).
 

Keppendur

Það eru nokkrir sérhæfðir gagnagrunnar byggðir á svipuðum meginreglum - dálkalaga, í minni, með áherslu á mjög mikið magn gagna. Vandamálið er að þetta eru sérhæfðir gagnagrunnar. Sláandi dæmi er Clickhouse. Þessi gagnagrunnur hefur mjög svipaða meginreglu og KDB+ til að geyma gögn á diski og byggja upp vísitölu; hann framkvæmir nokkrar fyrirspurnir hraðar en KDB+, þó ekki verulega. En jafnvel sem gagnagrunnur er Clickhouse sérhæfðari en KDB+ - vefgreiningar vs handahófskenndar tímaraðir (þessi munur er mjög mikilvægur - vegna hans er td ekki hægt að nota röðun skráa í Clickhouse). En síðast en ekki síst, Clickhouse hefur ekki fjölhæfni KDB+, tungumáls sem gerir kleift að vinna gögn beint í gagnagrunninn, frekar en að hlaða þeim fyrst inn í sérstakt forrit, byggja handahófskenndar SQL tjáningar, beita handahófskenndum aðgerðum í fyrirspurn, búa til ferla ekki tengt við framkvæmd sögulegra gagnagrunnsaðgerða. Þess vegna er erfitt að bera KDB+ saman við aðra gagnagrunna, þeir geta verið betri í vissum notkunartilfellum eða einfaldlega betri þegar kemur að klassískum gagnagrunnsverkefnum, en ég veit ekki um annað jafn áhrifaríkt og fjölhæft tæki til að vinna úr tímabundnum gögnum.
 

Python samþætting

Til að gera KDB+ auðveldara í notkun fyrir fólk sem ekki kannast við tæknina, bjó KX til bókasöfn til að samþætta Python þétt í einu ferli. Þú getur annað hvort hringt í hvaða Python aðgerð sem er frá Q, eða öfugt - hringt í hvaða Q aðgerð sem er frá Python (sérstaklega QSQL tjáning). Bókasöfn umbreyta, ef nauðsyn krefur (ekki alltaf í þágu hagkvæmni), gögnum úr sniði eins tungumáls yfir í snið annars. Fyrir vikið lifa Q og Python í svo nánu samlífi að mörkin á milli þeirra eru óskýr. Fyrir vikið hefur forritarinn annars vegar fullan aðgang að fjölmörgum gagnlegum Python bókasöfnum, hins vegar fær hann skjótan grunn til að vinna með stór gögn innbyggð í Python, sem er sérstaklega gagnlegt fyrir þá sem taka þátt í vélanámi. eða módelgerð.
 
Að vinna með Q í 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')  

tilvísanir

Heimasíða fyrirtækisins - https://kx.com/
Vefsíða fyrir forritara - https://code.kx.com/v2/
Bók Q For Mortals (á ensku) - https://code.kx.com/q4m3/
Greinar um KDB+/Q forrit frá kx starfsmönnum - https://code.kx.com/v2/wp/

Heimild: www.habr.com

Bæta við athugasemd