Ko nga ahuatanga o te reo Q me te KDB+ e whakamahi ana i te tauira o te ratonga tuuturu

Ka taea e koe te panui he aha te turanga KDB+, te reo whakahōtaka Q, he aha o raatau kaha me o raatau ngoikoretanga i roto i taku o mua Tuhinga me te poto i roto i te whakataki. I roto i te tuhinga, ka whakatinanahia e matou he ratonga i runga i te Q ka tukatuka i te awa raraunga taumai me te tatau i nga momo mahi whakahiato i ia meneti i roto i te aratau "waa tika" (ara, ka whai wa ki te tatau i nga mea katoa i mua i te waahanga o muri o nga raraunga). Ko te ahua nui o te Q he reo vector e taea ai e koe te whakahaere me te kore o nga mea kotahi, engari me o raatau raupapa, nga huinga huinga me etahi atu mea uaua. Ko nga reo penei i te Q me ona whanaunga K, J, APL he mea rongonui mo te poto. I te nuinga o nga wa, ka taea te tuhi i tetahi papatono e maha nga mata o te waehere i roto i te reo mohio penei i a Java ki runga i etahi rarangi. Koinei taku e hiahia ana ki te whakaatu i tenei tuhinga.

Ko nga ahuatanga o te reo Q me te KDB+ e whakamahi ana i te tauira o te ratonga tuuturu

Whakataki

Ko te KDB+ he papaa raraunga pou e arotahi ana ki te nui rawa o nga raraunga, kua whakaritea i runga i te huarahi motuhake (ma te waa). Ka whakamahia i roto i nga umanga putea - peeke, putea haumi, kamupene inihua. Ko te reo Q te reo o roto o KDB+ e taea ai e koe te mahi pai me enei raraunga. Ko te whakaaro Q he poto me te whai hua, i te mea ka tapaea te maarama. Ka tika tenei na te mea ka uaua te maarama ki te reo vector ahakoa he aha, na te poto me te whai kiko o te rekoata ka taea e koe te kite i tetahi waahanga nui atu o te kaupapa i runga i te mata kotahi, na te mutunga ka ngawari ake te maarama.

I roto i tenei tuhinga ka whakatinanahia e matou he kaupapa tino-tika i roto i te Q ka hiahia pea koe ki te whakamatau. Ki te mahi i tenei, ka hiahia koe ki te Q. Ka taea e koe te tango i te putanga 32-bit kore utu i runga i te paetukutuku kamupene kx - www.kx.com. I reira, ki te hiahia koe, ka kitea e koe nga korero tohutoro mo Q, te pukapuka Q Mo nga Tangata me nga momo tuhinga mo tenei kaupapa.

Kaupapa raru

He puna ka tukuna he ripanga me nga raraunga ia 25 manomano. I te mea ko te KDB+ te nuinga o te whakamahi i roto i nga putea, ka whakaaro matou he ripanga tenei mo nga tauwhitinga (tauhokohoko), kei a ia nga pou e whai ake nei: te wa (wa i roto i te milliseconds), sym (te tohu kamupene i runga i te utu hokohoko - IBM, AAPL,…), utu (te utu i hokona ai nga hea), te rahi (te rahi o te tauwhitinga). Ko te waahi 25 millisecond he waatea, kaore i te iti rawa, kaore i te roa rawa. Ko te tikanga ka tae mai nga raraunga ki te ratonga kua parea. He mea ngawari ki te whakatinana i te aukati i te taha o te ratonga, tae atu ki te aukati hihiri i runga i te kawenga o naianei, engari mo te ngawari, ka aro taatau ki te waa kua whakaritea.

Me tatau e te ratonga ia meneti mo ia tohu taumai mai i te pou tohu he huinga mahi whakahiato - utu teitei, utu toharite, rahinga moni, aha atu. nga korero whai hua. Mo te ngawari, ka whakaaro tatou ka taea te tatau i nga mahi katoa, i.e. ki te whiwhi i tetahi uara hou, he nui te mohio ki nga tau e rua - nga uara tawhito me nga uara taumai. Hei tauira, ko nga mahi max, toharite, tapeke kei a raatau tenei ahuatanga, engari ko te mahi waenga karekau.

Ka whakaaro ano matou ko te rerenga raraunga taumai he wa whakahau. Ma tenei ka whai waahi ki te mahi me te meneti whakamutunga anake. I roto i te mahi, he nui ki te kaha ki te mahi me nga meneti o naianei me nga meneti o mua mena ka tomuri etahi whakahou. Mo te ngawari, kaore matou e whakaaro ki tenei keehi.

Nga mahi whakahiato

Ko nga mahi whakahiato e hiahiatia ana kei raro nei. I tangohia e ahau te nuinga o ratou ki te whakapiki ake i te kawenga ki runga i te ratonga:

  • teitei – utu teitei – utu teitei mo ia meneti.
  • iti – utu min – utu iti mo ia meneti.
  • utu tuatahi – utu tuatahi – utu tuatahi ia meneti.
  • utu whakamutunga - utu whakamutunga - utu whakamutunga mo ia meneti.
  • Rahi tuatahi - rahi tuatahi - rahi hokohoko tuatahi ia meneti.
  • lastSize - rahi whakamutunga - rahi hokohoko whakamutunga i roto i te meneti.
  • numTrades – tatau i – te maha o nga hokohoko ia meneti.
  • rōrahi – rahinga rahi – tapeke o te rahi hokohoko ia meneti.
  • pvolume – tapeke utu – tapeke utu mo ia meneti, e hiahiatia ana mo te utu utu.
  • – te utu utu nui* rahi – te tapeke o nga whakawhitinga mo ia meneti.
  • avgPrice – pvolume%numTrades – utu toharite ia meneti.
  • AvgSize – rōrahi%numTrades – rahi hokohoko toharite ia meneti.
  • vwap – hurihanga%rōrahi – utu toharite mo ia meneti ka taumahahia e te rahi o te tauwhitinga.
  • cumVolume – tapeke rōrahi – rahinga whakaemi o ngā whakawhitinga i roto i te wā katoa.

Me matapaki tonu tatou i tetahi take kaore i kitea - me pehea te arawhiti i enei pou mo te wa tuatahi, mo ia meneti ka whai ake. Ko etahi pou o te momo Utu tuatahi me arawhiti ki te kore i ia wa; kaore i te tautuhia o raatau uara. Ko etahi atu momo rōrahi me tautuhi tonu ki te 0. He pou ano e hiahia ana kia whakakotahihia - hei tauira, me kape te cumVolume mai i te meneti o mua, me te mea tuatahi ki te 0. Me whakarite enei tawhā katoa ma te whakamahi i te raraunga papakupu momo (he rite ki te rekoata):

// list ! list – создать словарь, 0n – float null, 0N – long null, `sym – тип символ, `sym1`sym2 – список символов
initWith:`sym`time`high`low`firstPrice`lastPrice`firstSize`lastSize`numTrades`volume`pvolume`turnover`avgPrice`avgSize`vwap`cumVolume!(`;00:00;0n;0n;0n;0n;0N;0N;0;0;0.0;0.0;0n;0n;0n;0);
aggCols:reverse key[initWith] except `sym`time; // список всех вычисляемых колонок, reverse объяснен ниже

I taapirihia e ahau te tohu me te wa ki te papakupu mo te waatea, inaianei ko initWith he rarangi kua oti te hanga mai i te tepu whakahiato whakamutunga, kei reira tonu te whakatakoto i te tohu me te wa tika. Ka taea e koe te whakamahi hei taapiri i nga rarangi hou ki te ripanga.

Ka hiahia tatou ki aggCols ina hanga he mahi whakahiato. Me huri te rarangi i runga i te raupapa o nga korero i roto i te Q ka arotakehia (mai i te matau ki te maui). Ko te whainga ko te whakarite i te tatau i te ahunga mai i te teitei ki te cumVolume, na te mea ka whakawhirinaki etahi pou ki nga mea o mua.

Ko nga pou me kape ki te meneti hou mai i te waa o mua, ka taapirihia te pou tohu mo te waatea:

rollColumns:`sym`cumVolume;

Inaianei me wehewehe nga pou ki nga roopu kia rite ki te ahua o te whakahou. E toru nga momo ka taea te wehewehe:

  1. Accumulators (rōrahi, hurihanga, ..) – me tāpiri tatou te uara taumai ki te tetahi o mua.
  2. Ma te tohu motuhake (teitei, iti, ..) - ko te uara tuatahi i roto i te meneti ka tangohia mai i nga raraunga taumai, ko te toenga ka tatauhia ma te whakamahi i te mahi.
  3. Okioki. Ka tatauhia i nga wa katoa ma te whakamahi i tetahi taumahi.

Me tautuhi taurangi mo enei akomanga:

accumulatorCols:`numTrades`volume`pvolume`turnover;
specialCols:`high`low`firstPrice`firstSize;

Te raupapa tatauranga

Ka whakahouhia e matou te ripanga whakahiato kia rua nga waahanga. Mo te whai hua, i te tuatahi ka whakahekehia te ripanga taumai kia kotahi noa te rarangi mo ia ahua me ia meneti. Ko te mea ko o maatau mahi katoa he pikinga me te hono tahi e kii ana kaore e rereke nga hua o tenei waahanga taapiri. Ka taea e koe te whakaheke i te ripanga ma te whiriwhiri:

select high:max price, low:min price … by sym,time.minute from table

He kino tenei tikanga - kua tautuhia te huinga o nga pou tatau. Waimarie, i roto i te Q, ko te kowhiri ka whakatinanahia ano he mahi ka taea e koe te whakakapi i nga tohenga hanga hihiri:

?[table;whereClause;byClause;selectClause]

Kare au e tino whakamaarama i te whakatakotoranga o nga tohenga; i roto i a maatau, ma te kowhiria me te kowhiria nga korero karekau he whakaaro nui, me waiho hei papakupu mo nga ahua pou! Na, ko te mahi whakaheke ka taea te tautuhi penei:

selExpression:`high`low`firstPrice`lastPrice`firstSize`lastSize`numTrades`volume`pvolume`turnover!parse each ("max price";"min price";"first price";"last price";"first size";"last size";"count i";"sum size";"sum price";"sum price*size"); // each это функция map в Q для одного списка
preprocess:?[;();`sym`time!`sym`time.minute;selExpression];

Mo te whakamarama, i whakamahia e ahau te mahi parse, e huri ana i te aho me te whakahua Q ki te uara ka taea te tuku ki te mahi eval me te mea e hiahiatia ana i roto i te whiriwhiringa mahi. Kia mahara ano ka tautuhia te mahi o mua hei matapae (arā, he taumahi me nga tohenga kua tohua) o te taumahi kua tohua, kei te ngaro tetahi tohenga (te ripanga). Mena ka tono tatou i te tukatuka o mua ki te tepu, ka whiwhi tatou i te ripanga kua kopeke.

Ko te wahanga tuarua ko te whakahou i te ripanga whakahiato. Me tuhi tuatahi te algorithm ki te pseudocode:

for each sym in inputTable
  idx: row index in agg table for sym+currentTime;
  aggTable[idx;`high]: aggTable[idx;`high] | inputTable[sym;`high];
  aggTable[idx;`volume]: aggTable[idx;`volume] + inputTable[sym;`volume];
  …

I roto i te Q, he mea noa te whakamahi mapi/whakaiti mahi hei utu mo nga koropiko. Engari i te mea he reo vector a Q ka taea e taatau te whakamahi i nga mahi katoa ki nga tohu katoa i te wa kotahi, katahi ka taea e taatau te mahi me te kore he kohanga, ka mahi i nga mahi ki nga tohu katoa i te wa kotahi:

idx:calcIdx inputTable;
row:aggTable idx;
aggTable[idx;`high]: row[`high] | inputTable`high;
aggTable[idx;`volume]: row[`volume] + inputTable`volume;
…

Engari ka taea e taatau te haere ake, he kaiwhakahaere ahurei me te tino kaha a Q - te kaiwhakahaere taumahi whanui. Ka taea e koe te whakarereke i te huinga o nga uara i roto i te hanganga raraunga matatini ma te whakamahi i te rarangi o nga tohu, nga mahi me nga tautohetohe. I roto i to maatau ahua penei:

idx:calcIdx inputTable;
rows:aggTable idx;
// .[target;(idx0;idx1;..);function;argument] ~ target[idx 0;idx 1;…]: function[target[idx 0;idx 1;…];argument], в нашем случае функция – это присваивание
.[aggTable;(idx;aggCols);:;flip (row[`high] | inputTable`high;row[`volume] + inputTable`volume;…)];

Kia aroha mai, ki te tautapa ki te ripanga ka hiahia koe ki te rarangi rarangi haupae, kaua ki nga poupou, me whakawhiti koe i te matrix (rarangi o nga pou ki te rarangi rarangi) ma te whakamahi i te mahi pore. He utu nui tenei mo te teepu nui, no reira ka hoatu he taumahi whanui ki ia tīwae motuhake, ma te whakamahi i te mahinga mahere (he rite te ahua o te apostrophe):

.[aggTable;;:;]'[(idx;)each aggCols; (row[`high] | inputTable`high;row[`volume] + inputTable`volume;…)];

Ka whakamahia ano e matou te matapae mahi. Kia mahara ano kei te Q, he mahi ano te hanga rarangi ka taea e tatou te karanga ma te whakamahi i ia (mapi) mahi hei tiki rarangi rarangi.

Ki te whakarite kia kore te huinga o nga pou tatau kua whakaritea, ka hangaia e matou te korero o runga ake nei. Me tautuhi i nga mahi hei tatau i ia pou, ma te whakamahi i te rarangi me nga taurangi inp hei tohu ki nga raraunga whakahiato me te whakauru:

aggExpression:`high`low`firstPrice`lastPrice`firstSize`lastSize`avgPrice`avgSize`vwap`cumVolume!
 ("row[`high]|inp`high";"row[`low]&inp`low";"row`firstPrice";"inp`lastPrice";"row`firstSize";"inp`lastSize";"pvolume%numTrades";"volume%numTrades";"turnover%volume";"row[`cumVolume]+inp`volume");

He mea motuhake etahi pou; kaua e tatau te uara tuatahi ma te mahi. Ka taea e tatou te whakatau koinei te tuatahi ma te rarangi haupae[`numTrades] - mena he 0 kei roto, ko te uara te tuatahi. He mahi whiriwhiri a Q - ?[Rarangi Boolean;list1;list2] - ka kowhiri i tetahi uara mai i te rarangi 1, 2 ranei i runga i te ahuatanga o te tohenga tuatahi:

// high -> ?[isFirst;inp`high;row[`high]|inp`high]
// @ - тоже обобщенное присваивание для случая когда индекс неглубокий
@[`aggExpression;specialCols;{[x;y]"?[isFirst;inp`",y,";",x,"]"};string specialCols];

I konei ka karangahia e au he taumahi whanui me taku mahi (he korero i roto i nga taiapa mingimingi). Ka whiwhi i te uara o naianei (te tautohe tuatahi) me tetahi atu tohenga, ka tukuna e au ki te tawhā 4.

Me taapiri motuhake nga kaikorero pākahiko, na te mea he rite te mahi mo ratou:

// volume -> row[`volume]+inp`volume
aggExpression[accumulatorCols]:{"row[`",x,"]+inp`",x } each string accumulatorCols;

He mahi noa tenei na nga paerewa Q, engari kei te tautapa ahau i te rarangi o nga uara i te wa kotahi. Ka mutu, me hanga e tatou te mahi matua:

// ":",/:aggExprs ~ map[{":",x};aggExpr] => ":row[`high]|inp`high" присвоим вычисленное значение переменной, потому что некоторые колонки зависят от уже вычисленных значений
// string[cols],'exprs ~ map[,;string[cols];exprs] => "high:row[`high]|inp`high" завершим создание присваивания. ,’ расшифровывается как map[concat]
// ";" sv exprs – String from Vector (sv), соединяет список строк вставляя “;” посредине
updateAgg:value "{[aggTable;idx;inp] row:aggTable idx; isFirst_0=row`numTrades; .[aggTable;;:;]'[(idx;)each aggCols;(",(";"sv string[aggCols],'":",/:aggExpression aggCols),")]}";

Ma tenei korero, ka hanga hihiri ahau i tetahi mahi mai i tetahi aho kei roto te korero i hoatu e ahau i runga ake nei. Ko te hua ka penei te ahua:

{[aggTable;idx;inp] rows:aggTable idx; isFirst_0=row`numTrades; .[aggTable;;:;]'[(idx;)each aggCols ;(cumVolume:row[`cumVolume]+inp`cumVolume;… ; high:?[isFirst;inp`high;row[`high]|inp`high])]}

Ka huri te raupapa aro mātai tīwae nā te mea kei te Q ko te raupapa aro mātai mai i te matau ki te mauī.

Inaianei e rua nga mahi matua e tika ana mo nga tatauranga, me taapiri noa he hanganga iti ka rite te ratonga.

Nga mahi whakamutunga

Kei a maatau nga mahi preprocess me te whakahouAgg e mahi ana i nga mahi katoa. Engari me whakarite tonu te whakawhiti tika i roto i nga meneti me te tatau i nga tohu mo te whakahiato. Tuatahi, me tautuhi te mahi init:

init:{
  tradeAgg:: 0#enlist[initWith]; // создаем пустую типизированную таблицу, enlist превращает словарь в таблицу, а 0# означает взять 0 элементов из нее
  currTime::00:00; // начнем с 0, :: означает, что присваивание в глобальную переменную
  currSyms::`u#`symbol$(); // `u# - превращает список в дерево, для ускорения поиска элементов
  offset::0; // индекс в tradeAgg, где начинается текущая минута 
  rollCache:: `sym xkey update `u#sym from rollColumns#tradeAgg; // кэш для последних значений roll колонок, таблица с ключом sym
 }

Ka tautuhia hoki e matou te mahi pukapuka, ka huri i te meneti o naianei:

roll:{[tm]
  if[currTime>tm; :init[]]; // если перевалили за полночь, то просто вызовем init
  rollCache,::offset _ rollColumns#tradeAgg; // обновим кэш – взять roll колонки из aggTable, обрезать, вставить в rollCache
  offset::count tradeAgg;
  currSyms::`u#`$();
 }

Ka hiahiatia he mahi hei taapiri i nga tohu hou:

addSyms:{[syms]
  currSyms,::syms; // добавим в список известных
  // добавим в таблицу sym, time и rollColumns воспользовавшись обобщенным присваиванием.
  // Функция ^ подставляет значения по умолчанию для roll колонок, если символа нет в кэше. value flip table возвращает список колонок в таблице.
  `tradeAgg upsert @[count[syms]#enlist initWith;`sym`time,cols rc;:;(syms;currTime), (initWith cols rc)^value flip rc:rollCache ([] sym: syms)];
 }

Ka mutu, ko te mahi upd (te ingoa tuku iho mo tenei mahi mo nga ratonga Q), ka karangahia e te kaihoko ki te taapiri raraunga:

upd:{[tblName;data] // tblName нам не нужно, но обычно сервис обрабатывает несколько таблиц 
  tm:exec distinct time from data:() xkey preprocess data; // preprocess & calc time
  updMinute[data] each tm; // добавим данные для каждой минуты
};
updMinute:{[data;tm]
  if[tm<>currTime; roll tm; currTime::tm]; // поменяем минуту, если необходимо
  data:select from data where time=tm; // фильтрация
  if[count msyms:syms where not (syms:data`sym)in currSyms; addSyms msyms]; // новые символы
  updateAgg[`tradeAgg;offset+currSyms?syms;data]; // обновим агрегированную таблицу. Функция ? ищет индекс элементов списка справа в списке слева.
 };

Heoi ano. Anei te waehere katoa o ta maatau ratonga, i oatihia, he torutoru noa nga rarangi:

initWith:`sym`time`high`low`firstPrice`lastPrice`firstSize`lastSize`numTrades`volume`pvolume`turnover`avgPrice`avgSize`vwap`cumVolume!(`;00:00;0n;0n;0n;0n;0N;0N;0;0;0.0;0.0;0n;0n;0n;0);
aggCols:reverse key[initWith] except `sym`time;
rollColumns:`sym`cumVolume;

accumulatorCols:`numTrades`volume`pvolume`turnover;
specialCols:`high`low`firstPrice`firstSize;

selExpression:`high`low`firstPrice`lastPrice`firstSize`lastSize`numTrades`volume`pvolume`turnover!parse each ("max price";"min price";"first price";"last price";"first size";"last size";"count i";"sum size";"sum price";"sum price*size");
preprocess:?[;();`sym`time!`sym`time.minute;selExpression];

aggExpression:`high`low`firstPrice`lastPrice`firstSize`lastSize`avgPrice`avgSize`vwap`cumVolume!("row[`high]|inp`high";"row[`low]&inp`low";"row`firstPrice";"inp`lastPrice";"row`firstSize";"inp`lastSize";"pvolume%numTrades";"volume%numTrades";"turnover%volume";"row[`cumVolume]+inp`volume");
@[`aggExpression;specialCols;{"?[isFirst;inp`",y,";",x,"]"};string specialCols];
aggExpression[accumulatorCols]:{"row[`",x,"]+inp`",x } each string accumulatorCols;
updateAgg:value "{[aggTable;idx;inp] row:aggTable idx; isFirst_0=row`numTrades; .[aggTable;;:;]'[(idx;)each aggCols;(",(";"sv string[aggCols],'":",/:aggExpression aggCols),")]}"; / '

init:{
  tradeAgg::0#enlist[initWith];
  currTime::00:00;
  currSyms::`u#`symbol$();
  offset::0;
  rollCache:: `sym xkey update `u#sym from rollColumns#tradeAgg;
 };
roll:{[tm]
  if[currTime>tm; :init[]];
  rollCache,::offset _ rollColumns#tradeAgg;
  offset::count tradeAgg;
  currSyms::`u#`$();
 };
addSyms:{[syms]
  currSyms,::syms;
  `tradeAgg upsert @[count[syms]#enlist initWith;`sym`time,cols rc;:;(syms;currTime),(initWith cols rc)^value flip rc:rollCache ([] sym: syms)];
 };

upd:{[tblName;data] updMinute[data] each exec distinct time from data:() xkey preprocess data};
updMinute:{[data;tm]
  if[tm<>currTime; roll tm; currTime::tm];
  data:select from data where time=tm;
  if[count msyms:syms where not (syms:data`sym)in currSyms; addSyms msyms];
  updateAgg[`tradeAgg;offset+currSyms?syms;data];
 };

Te whakamātautau

Kia tirohia te mahinga o te ratonga. Ki te mahi i tenei, me whakahaere i roto i te tukanga motuhake (tukuhia te waehere ki te kōnae service.q) ka karangahia te mahi init:

q service.q –p 5566

q)init[]

I tetahi atu papatohu, timata i te tukanga Q tuarua ka hono ki te tuatahi:

h:hopen `:host:5566
h:hopen 5566 // если оба на одном хосте

Tuatahi, me hanga he rarangi tohu - 10000 nga waahanga me te taapiri i tetahi mahi hei hanga ripanga matapōkere. I te papatohu tuarua:

syms:`IBM`AAPL`GOOG,-9997?`8
rnd:{[n;t] ([] sym:n?syms; time:t+asc n#til 25; price:n?10f; size:n?10)}

I tapiritia e ahau etahi tohu tino e toru ki te rarangi kia maamaa ake te rapu i a raatau i te ripanga. Ko te mahi rnd he hanga ripanga matapōkere me nga n rarangi, he rereke te wa mai i te t ki te t+25 manomano.

Ka taea e koe te ngana ki te tuku raraunga ki te ratonga (taapirihia nga haora tuatahi tekau):

{h (`upd;`trade;rnd[10000;x])} each `time$00:00 + til 60*10

Ka taea e koe te tirotiro i roto i te ratonga kua whakahoutia te ripanga:

c 25 200
select from tradeAgg where sym=`AAPL
-20#select from tradeAgg where sym=`AAPL

Hua:

sym|time|high|low|firstPrice|lastPrice|firstSize|lastSize|numTrades|volume|pvolume|turnover|avgPrice|avgSize|vwap|cumVolume
--|--|--|--|--|--------------------------------
AAPL|09:27|9.258904|9.258904|9.258904|9.258904|8|8|1|8|9.258904|74.07123|9.258904|8|9.258904|2888
AAPL|09:28|9.068162|9.068162|9.068162|9.068162|7|7|1|7|9.068162|63.47713|9.068162|7|9.068162|2895
AAPL|09:31|4.680449|0.2011121|1.620827|0.2011121|1|5|4|14|9.569556|36.84342|2.392389|3.5|2.631673|2909
AAPL|09:33|2.812535|2.812535|2.812535|2.812535|6|6|1|6|2.812535|16.87521|2.812535|6|2.812535|2915
AAPL|09:34|5.099025|5.099025|5.099025|5.099025|4|4|1|4|5.099025|20.3961|5.099025|4|5.099025|2919

Inaianei me mahi whakamatautau uta kia mohio ai he aha te nui o nga raraunga ka taea e te ratonga te tukatuka ia meneti. Me whakamahara ahau ki a koe kua tautuhia e matou te waahi whakahou ki te 25 milliseconds. No reira, me uru te ratonga (i te toharite) ki roto i te 20 manomano hēkona ia whakahou kia whai wa ki nga kaiwhakamahi ki te tono raraunga. Whakauruhia nga mea e whai ake nei i te tukanga tuarua:

tm:10:00:00.000
stressTest:{[n] 1 string[tm]," "; times,::h ({st:.z.T; upd[`trade;x]; .z.T-st};rnd[n;tm]); tm+:25}
start:{[n] times::(); do[4800;stressTest[n]]; -1 " "; `min`avg`med`max!(min times;avg times;med times;max times)}

Ko te 4800 he rua meneti. Ka taea e koe te ngana ki te oma tuatahi mo nga rarangi 1000 ia 25 milihakona:

start 1000

I roto i taku keehi, ko te hua kei te tata ki te rua milliseconds mo ia whakahou. Na ka whakanuia e au te maha o nga rarangi ki te 10.000:

start 10000

Hua:

min| 00:00:00.004
avg| 9.191458
med| 9f
max| 00:00:00.030

Ano, kaore he mea motuhake, engari he 24 miriona nga raina mo ia meneti, 400 mano mo ia hekona. Neke atu i te 25 milliseconds, e 5 noa nga wa i puhoi te whakahou, i te wa i huri te meneti. Kia piki ake ki te 100.000:

start 100000

Hua:

min| 00:00:00.013
avg| 25.11083
med| 24f
max| 00:00:00.108
q)sum times
00:02:00.532

Ka taea e koe te kite, kaore e taea e te ratonga te whakatutuki, engari ka taea e ia te noho tonu. He nui rawa te rahi o nga raraunga (240 miriona rarangi ia meneti); i roto i enei keehi, he mea noa ki te whakarewa i te maha o nga kiore (te maha ranei o nga karaka) o te ratonga, ko ia waahanga he waahanga noa iho o nga tohu. Heoi ano, he mea whakamiharo te hua mo te reo whakamaori e aro nui ana ki te rokiroki raraunga.

Ka puta ake pea te patai he aha te wa ka tipu kore-raina me te rahi o ia whakahou. Ko te take ko te mahi whakaheke he tino mahi C, he pai ake i te whakahouAgg. Ka timata mai i tetahi rahi whakahōu (tata ki te 10.000), ka tae a updateAgg ki tona tuanui, katahi ka kore e whakawhirinaki tona wa mahi ki te rahi o te whakahou. Na te taahiraa tuatahi Q ka taea e te ratonga te keri i nga pukapuka penei. E whakaatu ana tenei i te mea nui ki te whiriwhiri i te algorithm tika i te wa e mahi ana me nga raraunga nui. Ko tetahi atu tohu ko te rokiroki tika o nga raraunga i roto i te mahara. Mena karekau nga raraunga i penapenahia i runga i te raarangi, kaore ranei i whakahaua e te waa, ka mohio tatou ki tetahi mea penei i te ngaro o te keteroki TLB - te kore o te wahitau wharangi mahara i roto i te keteroki wahitau tukatuka. Ko te rapu i tetahi wahitau e 30 nga wa roa ki te kore e angitu, a ki te marara te raraunga, ka taea te whakaroa i te ratonga i etahi wa.

mutunga

I roto i tenei tuhinga, i whakaatu ahau ko te KDB + me te Q he pai mo te rokiroki raraunga nui me te ngawari ki te uru atu ma te whiriwhiri, engari mo te hanga ratonga tukatuka raraunga e kaha ana ki te keri i nga rau miriona rarangi / gigabytes o nga raraunga tae noa ki roto kotahi te tukanga Q kotahi. Ko te reo Q ake ka taea te whakatinanatanga tino poto me te pai o nga algorithms e pa ana ki te tukatuka raraunga na te ahua o tona ahua vector, te kaiwhakamaori reo SQL kua hangaia me te huinga tino angitu o nga mahi whare pukapuka.

Ka kite ahau ko nga mea i runga ake nei he waahanga noa iho o nga mahi a Q, kei a ia ano etahi atu ahuatanga ahurei. Hei tauira, he kawa IPC tino ngawari ka whakakore i te rohenga i waenga i nga mahinga Q takitahi ka taea e koe te whakakotahi i nga rau o enei mahinga ki roto i te whatunga kotahi, ka taea te whakanoho ki runga i te maha o nga kaitoro i nga waahi rereke o te ao.

Source: will.com

Tāpiri i te kōrero