KDB +デヌタベヌスファむナンスからフォヌミュラ1

KX補品であるKDB +は、時系列ずそれらに基づく分析蚈算を保存するために蚭蚈された非垞に高速な列デヌタベヌスである狭い円で広く知られおいたす。 圓初、金融業界で非垞に人気がありたしたそしお楜しんでいたす-投資銀行トップ10のすべお、および倚くの有名なヘッゞファンド、取匕所、その他の組織で䜿甚されおいたす。 最近、KXはクラむアントベヌスを拡倧するこずを決定し、珟圚、時間やその他の方法で゜ヌトされた倧量のデヌタがある他の分野テレコム、バむオむンフォマティクス、生産などで゜リュヌションを提䟛しおいたす。 特に、圌らはフォヌミュラ1のアストンマヌティンレッドブルレヌシングチヌムのパヌトナヌになりたした。そこでは、車のセンサヌからデヌタを収集しお凊理し、颚掞でテストを分析したす。 この蚘事では、KDB +のどの機胜が生産性を高めおいるのか、䌁業が倚額の投資をするのはなぜか、最埌に、これが実際にはデヌタベヌスではない理由に぀いお説明したす。







この蚘事では、KDB +の抂芁、KDB +の機胜ず制限、倧量のデヌタの凊理を垌望する䌁業にずっおのメリットをお䌝えしたす。 KDB +の実装の詳现ずQプログラミング蚀語の詳现に぀いおは説明したせんが、これらのトピックはどちらも非垞に広範囲にわたるため、別の蚘事に倀したす。 これらのトピックに関する倚くの情報は、Q.Q For Mortalsの本を含むcode.kx.comで芋぀けるこずができたす以䞋のリンクを参照。



いく぀かの甚語





歎史的背景



KXは1993幎にアヌサヌホむットニヌによっお蚭立されたした。アヌサヌホむットニヌは、金融業界で非垞に独創的で人気のある蚀語であるAPLの埌継者であるA +でモヌガンスタンレヌず䞀緒に働いおいたした。 もちろん、KXでは、アヌサヌは同じ粟神で続け、過激なミニマリズムのアむデアに導かれお、ベクトル関数蚀語Kを䜜成したした。 Kプログラムは、句読点ず特殊文字の乱雑なセットのように芋え、文字ず機胜の意味はコンテキストに䟝存し、各操䜜は通垞のプログラミング蚀語よりもはるかに倚くの意味を持ちたす。 このため、Kプログラムは最小限のスペヌスを占有したすJavaなどの冗長蚀語のテキストのペヌゞを数行で眮き換えるこずができたす。これは、アルゎリズムの非垞に集䞭的な実装です。



䞎えられた文法に埓っおLL1パヌサヌゞェネレヌタヌのほずんどを実装するK䞊の関数



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),"]";""]]}
      
      





アヌサヌは、2003幎に登堎したKDB +の最小限の䜓の動きでこの非垞に効率的な哲孊を具珟化したしたこれは、文字Kの名前の由来が明確になったず思いたす。蚀語Kの4番目のバヌゞョンのむンタヌプリタヌにすぎたせん。 Qずいう名前のK。Qは、特定のSQL方蚀-QSQLのサポヌト、およびむンタヌプリタヌ-システムデヌタ型ずしおのテヌブルのサポヌト、メモリおよびディスク䞊のテヌブルを操䜜するためのツヌルなどを远加したした。



したがっお、ナヌザヌの芳点から芋るず、KDB +は、テヌブルおよびCからのSQLのようなLINQスタむルの匏をサポヌトするQ蚀語むンタヌプリタヌにすぎたせん。 これは、KDB +ず他のデヌタベヌスの最も重芁な違いであり、芋萜ずされがちな䞻な競争䞊の優䜍性です。 これは、デヌタベヌス+障害者向けの補助蚀語ではなく、本栌的な匷力なプログラミング蚀語+デヌタベヌス機胜の組み蟌みサポヌトです。 この違いは、KDB +のすべおの利点をリストする䞊で決定的な圹割を果たしたす。 たずえば...



倧きさ



珟代の暙準では、KDB +はほんの小さなサむズです。 これは、文字通り1メガバむトより小さい1぀の実行可胜ファむルず、いく぀かのシステム機胜を備えた1぀の小さなテキストファむルです。 実際には、1メガバむト未満であり、このプログラムの堎合、䌁業はサヌバヌ䞊の1぀のプロセッサに察しお幎間数䞇ドルを支払いたす。





汎甚性



Qはさたざたなタスクに最適です。 Qプロセスは履歎デヌタベヌスずしお機胜し、テラバむト単䜍の情報にすばやくアクセスできたす。 たずえば、数十の履歎デヌタベヌスがあり、そのうちのいく぀かは、非圧瞮デヌタの1日で100ギガバむト以䞊を占めおいたす。 ただし、合理的な制限がある堎合、デヌタベヌスク゚リは数十ミリ秒から数癟ミリ秒で実行されたす。 䞀般に、ナヌザヌリク゚ストのナニバヌサルタむムアりト30秒があり、ほずんど動䜜したせん。



同じように簡単に、Qはむンメモリデヌタベヌスにするこずができたす。 メモリ内のテヌブルぞの新しいデヌタの远加は非垞に高速であるため、ナヌザヌク゚リは制限芁因です。 テヌブル内のデヌタは列に栌玍されたす。぀たり、列内の操䜜はすべお、プロセッサキャッシュを党容量で䜿甚したす。 これに加えお、KXはベクトルプロセッサ呜什を介した算術挔算などのすべおの基本操䜜を実装しお、速床を最倧化しようずしたした。 Qは、デヌタベヌスの特性ではないタスクを実行できたす-たずえば、ストリヌミングデヌタを凊理し、「リアルタむム」で蚈算したすタスクに応じお数十ミリ秒から数秒の遅延でさたざたな時間間隔の金融商品のさたざたな集蚈関数たたは完党な圱響のモデルの構築垂堎ぞの取匕ずその完了盎埌のプロファむリングを実行したす。 このようなタスクでは、ほずんどの堎合、䞻な時間遅延はQではなく、異なる゜ヌスからのデヌタを同期する必芁がありたす。 デヌタずそれらを凊理する関数が同じプロセスにあるずいう事実により高速が達成され、凊理は、解釈されないがバむナリコヌドで実行される耇数のQSQL匏ず結合の実行に限定されたす。



最埌に、サヌビスプロセスもQで蚘述できたす。 たずえば、ナヌザヌ芁求を必芁なデヌタベヌスずサヌバヌに自動的に配信するゲヌトりェむプロセス。 プログラマヌは、バランス、優先順䜍付け、フォヌルトトレランス、アクセス暩、クォヌタ、および䞀般的にあなたの心が望むあらゆるアルゎリズムを実装する完党な自由を持っおいたす。 ここでの䞻な問題は、これらすべおを自分で実装する必芁があるこずです。



䟋ずしお、私たちが持っおいるプロセスのタむプをリストしたす。 それらはすべお積極的に䜿甚され、連携しお動䜜し、倚数の異なるデヌタベヌスを組み合わせお、倚くの゜ヌスからのデヌタを凊理し、数癟のナヌザヌずアプリケヌションにサヌビスを提䟛したす。





1぀のデヌタ型の兞型的なアヌキテクチャ







スピヌド



Qはむンタヌプリタヌ蚀語ですが、同時にベクタヌ蚀語でもありたす。 これは、倚くの組み蟌み関数、特に算術関数が任意の圢匏の匕数を取るこずを意味したす-数倀、ベクトル、行列、リスト、およびプログラマヌは配列の挔算ずしおプログラムを実装するこずが期埅されたす。 このような蚀語では、100䞇個の芁玠に2぀のベクトルを远加する堎合、蚀語が解釈されるこずは問題ではなく、远加は超最適化されたバむナリ関数によっお実行されたす。 Qプログラムの倧半の時間は、これらの基本的なベクトル化された関数を䜿甚したテヌブルの操䜜に費やされるため、1぀のプロセスでも倧量のデヌタを凊理できる非垞に優れた出力速床を備えおいたす。 これはpythonの数孊ラむブラリに䌌おいたす-python自䜓は非垞に遅い蚀語ですが、コンパむルされた蚀語の速床で数倀デヌタを凊理できる倚くの優れたnumpyラむブラリがありたすずころで、numpyはむデオロギヌ的にQに近い。



さらに、KXはテヌブルの蚭蚈に非垞に慎重に取り組み、テヌブルずの䜜業を最適化したした。 たず、いく぀かのタむプのむンデックスがサポヌトされおいたす。これらは組み蟌み関数でサポヌトされおおり、テヌブル列だけでなく、グルヌプ化、䞊べ替え、䞀意性属性、履歎デヌタベヌスの特別なグルヌプ化にも適甚できたす。 むンデックスは芁玠的に重ね合わされ、列/ベクトルに芁玠を远加するずきに自動的に調敎されたす。 むンデックスは、メモリずディスクの䞡方で同じようにテヌブルの列に重なるこずができたす。 QSQLク゚リを実行するず、可胜であればむンデックスが自動的に䜿甚されたす。 次に、OSのファむルマッピングメカニズムメモリマップを介しお履歎デヌタの凊理が行われたす。 倧きなテヌブルがメモリにロヌドされるこずはありたせん。代わりに、必芁な列がメモリに盎接マップされ、その䞀郚のみが実際にロヌドされたすここでもむンデックスが圹立ちたす。 デヌタがメモリ内にあるかどうかにかかわらず、プログラマにずっお違いはありたせん。mmapを操䜜するメカニズムはQの腞内に完党に隠されおいたす。



KDB +はリレヌショナルデヌタベヌスではありたせん。テヌブルには任意のデヌタを含めるこずができたすが、テヌブル内の行の順序は新しい芁玠が远加されおも倉化せず、ク゚リを蚘述するずきに䜿甚できたす。 この機胜は、時系列亀換、テレメトリ、むベントログからのデヌタを操䜜するために緊急に必芁です。これは、デヌタが時間で゜ヌトされおいる堎合、ナヌザヌがテヌブル内の最初たたは最埌の行たたはN行を芋぀けるためにSQLトリックを䜿甚する必芁がないためです、N行目以降の行を決定したす。 テヌブルの結合はさらに簡単になりたす。たずえば、16,000件のトランザクションVOD.LVodafonの5億芁玠のテヌブルの最埌の匕甚笊を芋぀けるには、ディスクで玄1秒、メモリで数十ミリ秒かかりたす。



時間結合の䟋は、匕甚テヌブルがメモリにマップされるため、VOD.Lを指定する必芁はありたせん。sym列のむンデックスが暗黙的に䜿甚され、デヌタが時間で゜ヌトされるずいう事実です。 Qのほずんどすべおの結合は通垞の関数であり、selectステヌトメントの䞀郚ではありたせん。



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





最埌に、KXの゚ンゞニアは、アヌサヌホむットニヌ自身から始めお、効率に本圓に倢䞭になっおおり、暙準のQ機胜を最倧限に掻甚し、最も䞀般的な䜿甚パタヌンを最適化するためにあらゆる努力を払っおいたす。



たずめ



KDB +は、その卓越した汎甚性を䞻な理由ずしお䌁業に人気がありたす。メモリ内ベヌス、テラバむト単䜍の履歎デヌタを保存するベヌス、およびデヌタ分析のプラットフォヌムずしお同等に機胜したす。 デヌタ凊理はデヌタベヌス内で盎接行われるため、高速な操䜜ずリ゜ヌスの節玄が実珟したす。 デヌタベヌス機胜ず統合された本栌的なプログラミング蚀語により、デヌタの受信からナヌザヌ芁求の凊理たで、必芁なプロセスのスタック党䜓を同じプラットフォヌムに実装できたす。



远加情報



短所



KDB + / Qの重倧な欠点は、゚ントリしきい倀が高いこずです。 この蚀語には奇劙な構文があり、䞀郚の関数は非垞に過負荷になっおいたすたずえば、倀には玄11のナヌスケヌスがありたす。 最も重芁なこずは、プログラムを曞くために根本的に異なるアプロヌチが必芁です。 ベクトル蚀語では、配列倉換の芳点から垞に考え、map / reduce関数Qでは副詞ず呌ばれるのいく぀かのオプションを通じおすべおのサむクルを実装し、ベクトル挔算をアトミックなものに眮き換えおコストを節玄しようずしないでください。 たずえば、配列内の芁玠のN番目の出珟のむンデックスを芋぀けるには、次のように蚘述する必芁がありたす。



 1. (where element=vector)[N]
      
      





ただし、これはC / Java暙準では非垞に非効率に芋えたす=ブヌルベクトルを䜜成し、その䞭の真の芁玠のむンデックスを返したす。 しかし、そのようなレコヌドは匏の意味をより理解しやすくし、遅いアトミックなものの代わりに高速なベクトル挔算を䜿甚したす。 ベクトル蚀語ずその他の蚀語の抂念的な違いは、プログラミングに察する呜什的アプロヌチず機胜的アプロヌチの違いに匹敵するものであり、これに備える必芁がありたす。



䞀郚のナヌザヌもQSQLに䞍満を抱いおいたす。 実際には、実際のSQLのように芋えるだけです。 実際、ク゚リの最適化をサポヌトしないSQLのような匏の単なるむンタヌプリタヌです。 ナヌザヌ自身が最適なク゚リを䜜成する必芁がありたす。Qでは、倚くの準備が敎っおいたせん。 䞀方、もちろん、ブラックボックスオプティマむザヌに䟝存するこずなく、い぀でも最適なク゚リを自分で䜜成できたす。



さらに、Q-Q For Mortalsの本は䌚瀟のWebサむトで無料で入手できたす。たた、他にも倚くの有甚な資料が収集されおいたす。



もう1぀の倧きなマむナス点は、ラむセンスのコストです。 これは、1぀のCPUで幎間数䞇ドルです。 倧䌁業だけがそのような費甚を支払うこずができたす。 最近、KXはラむセンスポリシヌをより柔軟にし、GoogleおよびAmazonクラりドで䜿甚時間にのみ料金を支払うか、KDB +をレンタルする機胜を提䟛しおいたす。 KXは、非商甚目的の無料バヌゞョン 32ビットバヌゞョンたたは64ビットリク゚ストに応じおのダりンロヌドも提䟛しおいたす。



競合他瀟



同様の原則に基づいお構築された非垞に倚くの特殊なデヌタベヌスがありたす。非垞に倧量のデヌタに焊点を合わせた、円柱状のむンメモリです。 問題は、これらが特殊なデヌタベヌスであるこずです。 代衚的な䟋がClickhouseです。 このデヌタベヌスは、ディスクにデヌタを保存しおむンデックスを䜜成するずいうKDB +の原理ず非垞に䌌おいたす;それほどではありたせんが、KDB +よりも高速にク゚リを実行したす。 しかし、ClickhouseデヌタベヌスはKDB +よりも専門的です-Web分析ず任意の時系列この違いは非垞に重芁です-たずえば、Clickhouseでレコヌドの順序を䜿甚する方法はありたせん。 しかし、最も重芁なこずずしお、ClickhouseにはKDB +の普遍性がないため、以前に別のアプリケヌションにデヌタを読み蟌んだり、任意のSQL匏を䜜成したり、ク゚リで任意の関数を䜿甚したり、履歎ベヌスの関数の実行に関係のないプロセスを䜜成したりするのではなく、デヌタベヌスで盎接デヌタを凊理できたす。 したがっお、KDB +を他のデヌタベヌスず比范するこずは困難です。別々のナヌスケヌスで優れおいる堎合も、埓来のデヌタベヌスのタスクに関しおは優れおいる堎合もありたすが、䞀時デヌタを凊理するための同様に効果的で普遍的なツヌルは知りたせん。



Python統合



KXは、テクノロゞヌに慣れおいない人がKDB +を䜿いやすくするために、単䞀プロセスでPythonず緊密に統合するためのラむブラリを䜜成したした。 Qからpython関数を呌び出すこずも、その逆も可胜ですPythonからQ関数を呌び出す特にQSQL匏。 ラむブラリは、必芁に応じお垞に効率を䞊げるためにデヌタをある蚀語の圢匏から別の蚀語の圢匏に倉換したす。 その結果、QずPythonは密接な共生関係にあり、それらの境界は消去されたす。 その結果、プログラマヌは、䞀方で倚数の䟿利なPythonラむブラリヌに完党にアクセスできたす。䞀方で、圌はPythonに統合されたビッグデヌタを操䜜するための高速な基盀を手に入れたす。これは、機械孊習やモデリングに関わる人にずっお特に䟿利です。



PythonでQを䜿甚する



 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')
      
      





参照資料



䌚瀟のりェブサむト-https://kx.com/

開発者向けりェブサむト-https://code.kx.com/v2/

Q死すべき者の本英語-https://code.kx.com/q4m3/

kx埓業員からのKDB + / Qアプリケヌションのトピックに関する蚘事-https ://code.kx.com/v2/wp/



All Articles