Vaega o le Q ma le KDB + gagana e faʻaaoga ai le faʻataʻitaʻiga o se auaunaga faʻapitoa

E mafai ona e faitau e uiga i le KDB + base, le gagana polokalame Q, o latou malosi ma vaivaiga i laʻu taimi muamua. tusiga ma faapuupuu i le folasaga. I totonu o le tusiga, o le a matou faʻatinoina se auaunaga i luga ole Q o le a faʻagasolo ai le faʻasologa o faʻamatalaga o loʻo oʻo mai ma faʻatusatusa galuega faʻapipiʻi eseese i minute uma i le "taimi moni" mode (o lona uiga, o le a maua le taimi e fuafua ai mea uma aʻo leʻi oʻo i le isi vaega o faʻamatalaga). O le uiga autu o le Q o le gagana vector lea e mafai ai ona e galue e le o ni mea e tasi, ae faʻatasi ai ma a latou faʻasologa, faʻasologa o faʻasologa ma isi mea faʻalavelave. O gagana e pei o Q ma ona aiga K, J, APL e lauiloa mo lo latou puʻupuʻu. E masani lava, o se polokalame e fa'aogaina ai le tele o laupepa o code i se gagana masani e pei o Java e mafai ona tusia i luga oi latou i ni nai laina. O le mea lea ou te manaʻo e faʻaalia i lenei tusiga.

Vaega o le Q ma le KDB + gagana e faʻaaoga ai le faʻataʻitaʻiga o se auaunaga faʻapitoa

Faatomuaga

KDB + o se faʻamaumauga tuʻufaʻatasiga e taulaʻi i le tele o faʻamaumauga, faʻatonu i se auala faʻapitoa (faʻapitoa i le taimi). E faʻaaoga muamua i faʻalapotopotoga tau tupe - faletupe, tupe teufaafaigaluega, kamupani inisiua. O le gagana Q o le gagana i totonu ole KDB+ e mafai ai ona e galue lelei ma nei faʻamatalaga. O le talitonuga Q e puupuu ma lelei, ae o le manino e ositaulagaina. E tauamiotonuina lenei mea i le mea moni o le gagana vector o le a faigata ona malamalama i soo se tulaga, ma o le puupuu ma le tamaoaiga o le pueina e mafai ai ona e vaʻai i se vaega tele atu o le polokalame i luga o le tasi lau, lea e faʻafaigofie ai ona malamalama.

I lenei tusiga matou te faʻatinoina se polokalame atoatoa i le Q ma atonu e te manaʻo e faʻataʻitaʻi. Ina ia faia lenei mea, e te manaʻomia le Q. E mafai ona e siiina le free 32-bit version i luga o le upega tafaʻilagi a le kamupani kx - www.kx.com. O iina, afai e te fiafia i ai, o le ae mauaina faʻamatalaga faʻamatalaga ile Q, le tusi Q Mo Tagata ma tala eseese i lenei autu.

Fausiaina o le faʻafitauli

O loʻo i ai se faʻapogai e tuʻuina atu se laulau ma faʻamaumauga i 25 milliseconds uma. Talu ai ona o le KDB + e faʻaaoga muamua i mea tau tupe, o le a tatou manatu o se laulau lenei o fefaʻatauaiga (fefaʻatauaʻiga), o loʻo i ai koluma nei: taimi (taimi i milliseconds), sym (faʻailoga kamupani i luga o fefaʻatauaiga - IBM, AAPL,…), tau (le tau na faatau ai sea), lapopoa (tele o le fefaʻatauaiga). Ole va ole 25 millisecond e fa'asa'oloto, e le la'ititi tele ma e le umi tele. O lona i ai o lona uiga o faʻamatalaga e oʻo mai i le 'auʻaunaga ua uma ona paʻu. O le a faigofie le faʻatinoina o le paʻu i luga o le itu o le tautua, e aofia ai le faʻamalosi malosi e faʻatatau i le uta o loʻo i ai nei, ae mo le faigofie, o le a tatou taulai atu i se vaitaimi tumau.

O le tautua e tatau ona faitau minute uma mo faʻailoga o loʻo oʻo mai mai le koluma faʻatusa se seti o galuega faʻapipiʻi - tau maualuga, tau averesi, aofaʻi tele, ma isi. faamatalaga aoga. Mo le faafaigofieina, o le a tatou manatu o galuega tauave uma e mafai ona fuafuaina faasolosolo, i.e. ina ia maua se tau fou, ua lava le iloa o numera e lua - o le tuai ma le tau sau. Mo se faʻataʻitaʻiga, o galuega tauave max, averesi, aofaiga o loʻo i ai lenei meatotino, ae o le galuega faʻatatau e leai.

O le a matou manatu foi o le faʻasologa o faʻamatalaga o loʻo oʻo mai o le taimi na faʻatonuina. O lenei mea o le a tatou maua ai le avanoa e galulue ai naʻo le minute mulimuli. I le faʻataʻitaʻiga, ua lava le mafai ona galue ma minute o loʻo i ai nei ma muamua pe a fai o nisi faʻafouga ua tuai. Mo le faigofie, o le a tatou le mafaufau i lenei mataupu.

Galuega fa'aopoopo

O galuega fa'aopoopo mana'omia o lo'o lisi atu i lalo. Na ou aveina le tele o latou e mafai ai e faʻateleina le uta i luga o le auaunaga:

  • maualuga - tau maualuga - tau maualuga ile minute.
  • maualalo - tau min - tau maualalo ile minute.
  • firstPrice – muamua tau – muamua tau i minute.
  • tau mulimuli – tau mulimuli – tau mulimuli ile minute.
  • firstSize - muamua tele - muamua fefa'ataua'iga tele i minute.
  • lastSize - lapopoa mulimuli - tele fefa'ataua'iga mulimuli i le minute.
  • numTrades - faitau i - numera o fefaʻatauaiga i le minute.
  • voluma - aofa'i tele - aofa'iga o fefa'ataua'iga i le minute.
  • pvolume – tau aofa’i – aofa’i o tau i minute, mana’omia mo le tau tau.
  • - aofa'i tau fa'aliliuga* tele - aofa'iga aofa'i o fefa'atauaiga i le minute.
  • avgPrice – pvolume%numTrades – tau averesi ile minute.
  • avgSize – volume%numTrades – averesi lapo'a fefa'ataua'iga ile minute.
  • vwap – turnover%volume – averesi tau ile minute fa'atatau ile tele o fefa'atauaiga.
  • cumVolume – aofa'i voluma - fa'aputuina tele o fefa'atauaiga i le taimi atoa.

Sei o tatou talanoaina vave se tasi o manatu e le o manino - pe faapefea ona amata nei koluma mo le taimi muamua ma mo minute taitasi mulimuli ane. O nisi koluma o le ituaiga FirstPrice e tatau ona amatalia i le null i taimi uma; o latou tau e le o faʻamalamalamaina. O isi ituaiga voluma e tatau ona seti i taimi uma i le 0. E iai foʻi koluma e manaʻomia ai se tuʻufaʻatasiga - mo se faʻataʻitaʻiga, cumVolume e tatau ona kopi mai le minute muamua, ma mo le muamua seti i le 0. Sei o tatou seti uma nei taʻiala e faʻaaoga ai faʻamatalaga lolomifefiloi ituaiga (faatusa ma se faamaumauga):

// 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 объяснен ниже

Na ou faʻaopoopoina le sym ma le taimi i le lomifefiloi mo le faʻaogagofie, o le initWith o se laina saunia mai le laulau faʻapipiʻi mulimuli, lea e tumau ai e seti le sym saʻo ma le taimi. E mafai ona e fa'aogaina e fa'aopoopo ai laina fou ile laulau.

Matou te manaʻomia aggCols pe a fatuina se galuega faʻapipiʻi. E tatau ona fesuia'i le lisi ona o le fa'asologa o fa'amatalaga i le Q e iloiloina (mai le taumatau i le agavale). O le fa'amoemoe o le fa'amautinoa e alu le fa'atatauga mai le maualuga i le cumVolume, talu ai o nisi koluma e fa'alagolago i mea muamua.

Koluma e mana'omia ona kopi i se minute fou mai le taimi muamua, e fa'aopoopo le koluma fa'atusa mo le fa'aogagofie:

rollColumns:`sym`cumVolume;

Ia tatou vaevae nei koluma i ni vaega e tusa ai ma le auala e tatau ona faafou ai. E tolu ituaiga e mafai ona fa'avasegaina:

  1. Accumulators (volume, turnover, ..) - e tatau ona tatou faʻaopoopo le tau o loʻo oʻo mai i le muamua.
  2. Faʻatasi ai ma se tulaga faʻapitoa (maualuga, maualalo, ..) - o le tau muamua i le minute e ave mai faʻamatalaga o loʻo oʻo mai, o isi mea e faʻatatau i le faʻaaogaina o le galuega.
  3. Malolo. Fa'atatau i taimi uma e fa'aaoga ai se galuega.

Sei o tatou fa'auiga fesuiaiga mo vasega nei:

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

Fa'atonuga fa'atatau

O le a matou fa'afouina le laulau tu'ufa'atasi i vaega e lua. Mo le lelei, matou te faʻaitiitia muamua le laulau sau ina ia naʻo le tasi le laina mo tagata taʻitasi ma minute. O le mea moni o a tatou galuega uma e faʻaopoopoina ma faʻatasi e faʻamaonia ai o le taunuuga o lenei laasaga faaopoopo o le a le suia. E mafai ona e fa'aitiitia le laulau e fa'aaoga ai le filifiliga:

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

O lenei metotia o loʻo i ai se faʻaletonu - o le seti o koluma fuafuaina ua faʻamaonia muamua. O le mea e lelei ai, i le Q, filifili o loʻo faʻatinoina foi e avea o se galuega e mafai ai ona e suitulaga i finauga faʻamalosia:

?[table;whereClause;byClause;selectClause]

O le a ou le fa'amatalaina au'ili'ili le fa'atulagaina o finauga, i lo tatou tulaga, na'o le ma le filifilia o fa'amatalaga o le a le fa'atauva'a ma e tatau ona avea ma lomifefiloi o foliga koluma!fa'aaliga. O le mea lea, e mafai ona faʻamatalaina le galuega faʻaitiitia e pei ona taua i lalo:

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 le manino, na ou faʻaaogaina le galuega parse, lea e liliu ai se manoa ma se faʻamatalaga Q i se tau e mafai ona pasi atu i le galuega eval ma e manaʻomia i le galuega filifilia. Ia maitauina foi o le muai faagasologa ua faauigaina o se faʻataʻitaʻiga (faʻataʻitaʻiga, o se galuega ma faʻamatalaga faʻapitoa) o le galuega filifilia, tasi le finauga (le laulau) o loʻo misi. Afai tatou te faʻaogaina muamua le faʻasologa i se laulau, o le a tatou maua se laulau faʻapipiʻi.

O le vaega lona lua o le fa'afouina o le laulau fa'aopoopo. Sei o tatou tusia muamua le algorithm i le 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 le Q, e masani ona fa'aoga fa'afanua/fa'aititia galuega nai lo matasele. Ae talu ai o le Q o se gagana vector ma e faigofie ona tatou faʻaogaina uma gaioiga i faʻailoga uma i le taimi e tasi, ona oʻo lea i se faʻatusatusaga muamua e mafai ona tatou faia e aunoa ma se matasele, faʻatino gaioiga i luga o faʻailoga uma i le taimi e tasi:

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

Ae e mafai ona tatou agai i luma, Q o loʻo i ai se tagata faʻapitoa ma sili ona mamana - o le faʻatonuina o tofiga. E faʻatagaina oe e sui se seti o tau i totonu o se faʻamaumauga faʻapitoa e faʻaaoga ai se lisi o faʻamatalaga, galuega ma finauga. I la matou tulaga e pei o lenei:

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;…)];

O le mea e leaga ai, e tuʻuina atu i se laulau e te manaʻomia se lisi o laina, ae le o koluma, ma e tatau ona e faʻaliliuina le matrix (lisi o koluma i le lisi o laina) e faʻaaoga ai le faʻaogaina o le faʻaoga. E taugata lenei mea mo se laulau tele, o lea matou te faʻaogaina se tofiga lautele i koluma taʻitasi eseese, faʻaaoga le faʻafanua galuega (e foliga mai o se apostrophe):

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

Matou te toe faʻaaogaina galuega faʻatulagaina. Ia maitauina foi i le Q, o le fatuina o se lisi o se galuega foi ma e mafai ona tatou taʻua i le faʻaaogaina o galuega taʻitasi (faafanua) e maua ai se lisi o lisi.

Ina ia mautinoa e le o faʻamautu le seti o koluma fuafuaina, matou te fatuina le faʻamatalaga o loʻo i luga ma le malosi. Se'i o tatou fa'amalamalama muamua galuega e fa'atatau i koluma ta'itasi, fa'aaoga le laina ma le inp fesuia'i e fa'asino i fa'amaumauga tu'ufa'atasia ma fa'aoga:

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");

O nisi koluma e fa'apitoa; o latou tau muamua e le tatau ona fuafuaina e le galuega. E mafai ona tatou iloa o le mea muamua lea i le laina [`numTrades] koluma - afai e iai le 0, o lona uiga e muamua le tau. Q ei ai se galuega filifilia - ?[Boolean list;list1;list2] - lea e filifilia se tau mai le lisi 1 poʻo le 2 e faʻatatau i le tulaga i le finauga muamua:

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

O iinei na ou taʻua ai se tofiga lautele ma laʻu galuega (o se faʻaaliga i fusi faʻafefe). Na te mauaina le tau o loʻo i ai nei (le finauga muamua) ma se finauga faaopoopo, lea ou te pasia i le 4th parameter.

Se'i o tatou fa'aopoopo fa'atasi maa failauga, talu ai e tutusa le galuega mo i latou:

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

Ole galuega masani lea ile Q standards, ae o loʻo ou tuʻuina atu se lisi o tau ile taimi e tasi. Ma le mea mulimuli, seʻi o tatou fatuina le galuega autu:

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

Faatasi ai ma lenei faaupuga, ou te faia ma le malosi se galuega mai se manoa o loʻo i ai le faʻamatalaga na ou tuʻuina atu i luga. O le taunuuga o le a pei o lenei:

{[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])]}

O le faasologa o iloiloga o le koluma ua fesuia'i ona o le Q o le faasologa o iloiloga e mai le taumatau i le agavale.

Ole taimi nei e lua a tatou galuega autu e manaʻomia mo faʻatusatusaga, naʻo le manaʻomia o le faʻaopoopoina o sina atinaʻe ma ua saunia le auaunaga.

Laasaga mulimuli

E i ai a matou galuega muamua ma faʻafouinaAgg e faia uma galuega. Ae e manaʻomia pea le faʻamautinoaina o le suiga saʻo e ala i minute ma faʻatatau faʻamatalaga mo le faʻapipiʻiina. Muamua, seʻi o tatou faʻamatalaina le galuega 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
 }

O le a matou faʻamatalaina foi le galuega taʻavale, lea o le a suia ai le minute o loʻo iai nei:

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

Matou te manaʻomia se galuega e faʻaopoopo ai mataitusi fou:

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

Ma le mea mulimuli, o le upd function (le igoa masani mo lenei galuega mo auaunaga Q), lea e valaʻau e le kalani e faʻaopoopo faʻamaumauga:

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]; // обновим агрегированную таблицу. Функция ? ищет индекс элементов списка справа в списке слева.
 };

Pau lava lena. O le fa'asologa atoa lea o la matou 'au'aunaga, e pei ona folafolaina, na'o ni nai laina:

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];
 };

Suʻega

Sei o tatou siaki le faatinoga o le auaunaga. Ina ia faia lenei mea, seʻi o tatou taʻavale i se isi faiga (tuu le code i le faila service.q) ma valaʻau le galuega init:

q service.q –p 5566

q)init[]

I se isi faʻamafanafanaga, amata le faiga lona lua Q ma faʻafesoʻotaʻi i le muamua:

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

Muamua, tatou faia se lisi o faʻailoga - 10000 fasi pepa ma faʻaopoopo se galuega e fatu ai se laulau faʻafuaseʻi. I le faʻamafanafanaga lona lua:

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

Na ou faaopoopoina ni faatusa moni se tolu i le lisi ina ia faafaigofie ai ona sueina i latou i le laulau. O le galuega rnd e fausia ai se laulau fa'afuase'i ma n laina, lea e eseese ai le taimi mai le t i le t+25 milliseconds.

Ole taimi nei e mafai ona e taumafai e lafo faʻamatalaga ile tautua (faʻaopoopo le sefulu itula muamua):

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

E mafai ona e siaki i le tautua ua toe fa'afouina le laulau:

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

Taunuʻuga:

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

Se'i o tatou faia nei le su'ega o uta e su'e ai pe fia le tele o fa'amaumauga e mafai e le tautua ona fa'agasolo ile minute. Sei ou faamanatu atu ia te oe ua matou setiina le va o le faafouga i le 25 milliseconds. E tusa ai, e tatau i le 'auʻaunaga (i le averesi) ona ofi i totonu ole 20 milliseconds ile faʻafouga e tuʻuina atu ai i tagata faʻaoga le taimi e talosagaina ai faʻamatalaga. Ulufale mea nei i le faiga lona lua:

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

4800 e lua minute. E mafai ona e taumafai e tamo'e muamua mo le 1000 laina i le 25 milliseconds:

start 1000

I loʻu tulaga, o le taunuuga e tusa ma le lua milliseconds ile faʻafouga. O lea o le a vave ona ou faateleina le numera o laina i le 10.000:

start 10000

Taunuʻuga:

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

Ma le isi, e leai se mea faʻapitoa, ae o le 24 miliona laina i le minute, 400 afe i le sekone. Mo le sili atu i le 25 milliseconds, na o le 5 taimi na faʻagesegese ai le faʻafouga, e foliga mai ina ua suia le minute. Tatou fa'ateleina i le 100.000:

start 100000

Taunuʻuga:

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

E pei ona e vaʻai, e tau le mafai e le tautua, ae ui i lea e mafai ona faʻafefe. O le tele o faʻamaumauga (240 miliona laina i le minute) e matua tele lava; i ia tulaga, e masani ona faʻalauiloa le tele o clones (poʻo le tele foi o clones) o le tautua, o ia mea e faʻatautaia naʻo se vaega o mataitusi. Ae ui i lea, o le taunuuga e mataʻina mo se gagana faʻamatalaina e taulaʻi muamua i le teuina o faʻamaumauga.

O le fesili e ono tula'i mai pe aisea e tupu ai le taimi e le o laina fa'atasi ma le tele o fa'afouga ta'itasi. O le mafuaʻaga o le faʻaitiitia o galuega o se galuega C, lea e sili atu le lelei nai lo le updateAgg. Amata mai i se faʻamatalaga faʻafou (tusa ma le 10.000), updateAgg e oʻo atu i lona faʻalo ma lona taimi faʻataunuʻu e le faʻalagolago i le tele o faʻafouga. E mafua ona o le laasaga muamua Q e mafai ai e le 'auʻaunaga ona suʻeina ia tele o faʻamaumauga. O lenei mea e faʻamaonia ai le taua tele o le filifilia o le algorithm saʻo pe a galue ma faʻamatalaga tetele. O le isi itu o le teuina sa'o o fa'amaumauga i le manatua. Afai o faʻamatalaga e leʻi teuina i luga ole laiga pe leʻi faʻatonuina i le taimi, ona tatou masani lea i se mea e pei o le TLB cache misi - o le leai o se tuatusi itulau manatua i totonu ole tuatusi tuatusi cache. O le su'eina o se tuatusi e tusa ma le 30 taimi le umi pe a le manuia, ma afai e ta'ape fa'amaumauga, e mafai ona fa'agesegese le auaunaga i le tele o taimi.

iʻuga

I lenei tusiga, na ou faʻaalia ai o le KDB + ma le Q database e talafeagai e le gata mo le teuina o faʻamatalaga tetele ma faigofie ona maua e ala i le filifilia, ae faʻapea foʻi mo le fatuina o faʻamaumauga o faʻamaumauga e mafai ona faʻaogaina le selau miliona o laina / gigabytes o faʻamaumauga e oʻo lava i totonu. tasi le faiga Q tasi. O le gagana Q lava ia e fa'atagaina ai le fa'atinoina ma'oti ma le lelei o algorithms e feso'ota'i ma fa'agaioiga o fa'amaumauga ona o lona natura ve'a, fausia-i totonu ole gagana fa'aliliu upu SQL ma se seti manuia o galuega a le faletusi.

O le a ou matauina o loʻo i luga o se vaega o mea e mafai e Q ona fai, e iai foʻi isi uiga tulaga ese. Mo se faʻataʻitaʻiga, o se faʻataʻitaʻiga faigofie IPC e tapeina le tuaoi i le va o faiga Q taʻitoʻatasi ma faʻatagaina oe e tuʻufaʻatasia le faitau selau o nei faiga i totonu o se fesoʻotaʻiga e tasi, lea e mafai ona maua i luga o le tele o sapalai i vaega eseese o le lalolagi.

puna: www.habr.com

Faaopoopo i ai se faamatalaga