เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ‚เบญเบ‡เบžเบฒเบชเบฒ Q เปเบฅเบฐ KDB+ เป‚เบ”เบเปƒเบŠเป‰เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เปเบšเบšเบชเบปเบ”เป†

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เบเปˆเบฝเบงเบเบฑเบšเบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡ KDB+, เบžเบฒเบชเบฒเบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบก Q เปเบกเปˆเบ™เบซเบเบฑเบ‡, เบˆเบธเบ”เปเบ‚เบ‡เปเบฅเบฐเบˆเบธเบ”เบญเปˆเบญเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเปเบกเปˆเบ™เบซเบเบฑเบ‡เปƒเบ™เบญเบฐเบ”เบตเบ”เบ‚เบญเบ‡เบ‚เป‰เบญเบ เบšเบปเบ”เบ„เบงเบฒเบก เปเบฅเบฐเป„เบฅเบเบฐเบชเบฑเป‰เบ™เป†เปƒเบ™เบเบฒเบ™เปเบ™เบฐเบ™เปเบฒ. เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบก, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบเปˆเบฝเบงเบเบฑเบš Q เบ—เบตเปˆเบˆเบฐเบ›เบฐเบกเบงเบ™เบœเบปเบ™เบเบฐเปเบชเบ‚เปเป‰เบกเบนเบ™เบ‚เบฒเป€เบ‚เบปเป‰เบฒเปเบฅเบฐเบ„เบดเบ”เป„เบฅเปˆเบซเบ™เป‰เบฒเบ—เบตเปˆเบฅเบงเบกเบ•เปˆเบฒเบ‡เป†เปƒเบ™เบ—เบธเบเป†เบ™เบฒเบ—เบตเปƒเบ™เบฎเบนเบšเปเบšเบš "เป€เบงเบฅเบฒเบˆเบดเบ‡" (เป€เบŠเบฑเปˆเบ™: เบกเบฑเบ™เบˆเบฐเบกเบตเป€เบงเบฅเบฒเบ—เบตเปˆเบˆเบฐเบ„เบดเบ”เป„เบฅเปˆเบ—เบธเบเบขเปˆเบฒเบ‡เบเปˆเบญเบ™เบ‚เปเป‰เบกเบนเบ™เบชเปˆเบงเบ™เบ•เปเปˆเป„เบ›). เบฅเบฑเบเบชเบฐเบ™เบฐเบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡ Q เปเบกเปˆเบ™เบงเปˆเบฒเบกเบฑเบ™เป€เบ›เบฑเบ™เบžเบฒเบชเบฒ vector เบ—เบตเปˆเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบšเปเปˆเปเบกเปˆเบ™เบเบฑเบšเบงเบฑเบ”เบ–เบธเบ”เบฝเบง, เปเบ•เปˆเบเบฑเบš arrays, array เบ‚เบญเบ‡ array เปเบฅเบฐเบงเบฑเบ”เบ–เบธเบชเบฐเบฅเบฑเบšเบชเบฑเบšเบŠเป‰เบญเบ™เบญเบทเปˆเบ™เป†. เบžเบฒเบชเบฒเป€เบŠเบฑเปˆเบ™ Q เปเบฅเบฐเบžเบตเปˆเบ™เป‰เบญเบ‡เบ‚เบญเบ‡เบกเบฑเบ™ K, J, APL เปเบกเปˆเบ™เบกเบตเบŠเบทเปˆเบชเบฝเบ‡เบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเบซเบเปเป‰เบ‚เบญเบ‡เบกเบฑเบ™. เป€เบฅเบทเป‰เบญเบเป†, เป‚เบ›เบฅเปเบเบฅเบกเบ—เบตเปˆเป€เบญเบปเบฒเบฅเบฐเบซเบฑเบ”เบซเบผเบฒเบเบซเบ™เป‰เบฒเบˆเปเปƒเบ™เบžเบฒเบชเบฒเบ—เบตเปˆเบ„เบธเป‰เบ™เป€เบ„เบตเบเป€เบŠเบฑเปˆเบ™ Java เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ‚เบฝเบ™เปƒเบชเปˆเบžเบงเบเบกเบฑเบ™เปƒเบ™เบชเบญเบ‡เบชเบฒเบกเปเบ–เบง. เบ™เบตเป‰เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เบเบฒเบ™เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰.

เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ‚เบญเบ‡เบžเบฒเบชเบฒ Q เปเบฅเบฐ KDB+ เป‚เบ”เบเปƒเบŠเป‰เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เปเบšเบšเบชเบปเบ”เป†

เบเบฒเบ™เบ™เปเบฒเบชเบฐเป€เบซเบ™เบต

KDB+ เปเบกเปˆเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ–เบฑเบ™เบ—เบตเปˆเป€เบ™เบฑเป‰เบ™เปƒเบชเปˆเบ‚เปเป‰เบกเบนเบ™เบˆเปเบฒเบ™เบงเบ™เบซเบผเบงเบ‡เบซเบผเบฒเบ, เบˆเบฑเบ”เบฎเบฝเบ‡เบ•เบฒเบกเปเบšเบšเบชเบฐเป€เบžเบฒเบฐ (เบ•เบปเป‰เบ™เบ•เปเปเบกเปˆเบ™เบ•เบฒเบกเป€เบงเบฅเบฒ). เบกเบฑเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบ•เบปเป‰เบ™เบ•เปเปƒเบ™เบชเบฐเบ–เบฒเบšเบฑเบ™เบเบฒเบ™เป€เบ‡เบดเบ™ - เบ—เบฐเบ™เบฒเบ„เบฒเบ™, เบเบญเบ‡เบ—เบถเบ™เบเบฒเบ™เบฅเบปเบ‡เบ—เบถเบ™, เบšเปเบฅเบดเบชเบฑเบ”เบ›เบฐเบเบฑเบ™เป„เบž. เบžเบฒเบชเบฒ Q เปเบกเปˆเบ™เบžเบฒเบชเบฒเบžเบฒเบเปƒเบ™เบ‚เบญเบ‡ KDB+ เบ—เบตเปˆเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบ™เบตเป‰เป„เบ”เป‰เบขเปˆเบฒเบ‡เบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš. เบญเบธเบ”เบปเบกเบเบฒเบ™ Q เปเบกเปˆเบ™ brevity เปเบฅเบฐเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš, เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบ„เบงเบฒเบกเบŠเบฑเบ”เป€เบˆเบ™เปเบกเปˆเบ™เบเบฒเบ™เป€เบชเบเบชเบฐเบฅเบฐ. เบ™เบตเป‰เปเบกเปˆเบ™เป€เบซเบ”เบœเบปเบ™เป‚เบ”เบเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบžเบฒเบชเบฒ vector เบˆเบฐเบเบฒเบเบ—เบตเปˆเบˆเบฐเป€เบ‚เบปเป‰เบฒเปƒเบˆเปƒเบ™เบเปเบฅเบฐเบ™เบตเปƒเบ”เบเปเปˆเบ•เบฒเบก, เปเบฅเบฐเบ„เบงเบฒเบกเบญเบธเบ”เบปเบกเบชเบปเบกเบšเบนเบ™เบ‚เบญเบ‡เบเบฒเบ™เบšเบฑเบ™เบ—เบถเบเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เป€เบซเบฑเบ™เบชเปˆเบงเบ™เปƒเบซเบเปˆเบเบงเปˆเบฒเบ‚เบญเบ‡เป‚เบ›เปเบเบกเปƒเบ™เบซเบ™เป‰เบฒเบˆเปเบ”เบฝเบง, เป€เบŠเบดเปˆเบ‡เปƒเบ™เบ—เบตเปˆเบชเบธเบ”เป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เบ‡เปˆเบฒเบเบ•เปเปˆเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเปƒเบˆ.

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบ›เบฐเบ•เบดเบšเบฑเบ”เป‚เบ„เบ‡เบเบฒเบ™เป€เบ•เบฑเบกเบฎเบนเบšเปเบšเบšเปƒเบ™ Q เปเบฅเบฐเบ—เปˆเบฒเบ™เบญเบฒเบ”เบˆเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™เบฅเบญเบ‡เบกเบฑเบ™เบญเบญเบ. เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบ—เปˆเบฒเบ™เบˆเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™ Q. เบ•เบปเบงเบˆเบดเบ‡, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ”เบฒเบงเป‚เบซเบฅเบ”เป€เบงเบตเบŠเบฑเบ™ 32-bit เป„เบ”เป‰เบŸเบฃเบตเบขเบนเปˆเปƒเบ™เป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ‚เบญเบ‡เบšเปเบฅเบดเบชเบฑเบ” kx - www.kx.com. เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™, เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบชเบปเบ™เปƒเบˆ, เบ—เปˆเบฒเบ™เบˆเบฐเบŠเบญเบเบซเบฒเบ‚เปเป‰เบกเบนเบ™เบญเป‰เบฒเบ‡เบญเบตเบ‡เบเปˆเบฝเบงเบเบฑเบš Q, เบ›เบทเป‰เบก เบ–เบฒเบกเบชเปเบฒเบฅเบฑเบšเบกเบฐเบ™เบธเบ” เปเบฅเบฐเบšเบปเบ”เบ„เบงเบฒเบกเบ•เปˆเบฒเบ‡เป†เบเปˆเบฝเบงเบเบฑเบšเบซเบปเบงเบ‚เปเป‰เบ™เบตเป‰.

เบเบฒเบ™เบชเป‰เบฒเบ‡เบšเบฑเบ™เบซเบฒ

เบกเบตเปเบซเบผเปˆเบ‡เบ—เบตเปˆเบชเบปเปˆเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเบกเบตเบ‚เปเป‰เบกเบนเบ™เบ—เบธเบเป† 25 milliseconds. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบ KDB+ เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบ•เบปเป‰เบ™เบ•เปเปƒเบ™เบ”เป‰เบฒเบ™เบเบฒเบ™เป€เบ‡เบดเบ™, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒ (เบเบฒเบ™เบ„เป‰เบฒ), เบ—เบตเปˆเบกเบตเบ–เบฑเบ™เบ•เปเปˆเป„เบ›เบ™เบตเป‰: เป€เบงเบฅเบฒ (เป€เบงเบฅเบฒเป€เบ›เบฑเบ™ milliseconds), sym (เบเบฒเบ™เบเปเบฒเบ™เบปเบ”เบšเปเบฅเบดเบชเบฑเบ”เปƒเบ™เบ•เบฐเบซเบผเบฒเบ”เบซเบผเบฑเบเบŠเบฑเบš -. IBM, AAPL,โ€ฆ), เบฅเบฒเบ„เบฒ (เบฅเบฒเบ„เบฒเบ—เบตเปˆเบฎเบธเป‰เบ™เป„เบ”เป‰เบ–เบทเบเบŠเบทเป‰), เบ‚เบฐเบซเบ™เบฒเบ” (เบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒ). เป„เบฅเบเบฐเบซเปˆเบฒเบ‡ 25 millisecond เปเบกเปˆเบ™เบ•เบฒเบกเปƒเบˆเบกเบฑเบ, เบšเปเปˆเบ™เป‰เบญเบเป€เบเบตเบ™เป„เบ› เปเบฅเบฐ เบšเปเปˆเบ”เบปเบ™เป€เบเบตเบ™เป„เบ›. เบเบฒเบ™เบ›เบฐเบเบปเบ”เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบ‚เปเป‰เบกเบนเบ™เบกเบฒเบฎเบญเบ”เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ—เบตเปˆเบ–เบทเบ buffed เปเบฅเป‰เบง. เบกเบฑเบ™เบˆเบฐเป€เบ›เบฑเบ™เบเบฒเบ™เบ‡เปˆเบฒเบเบ—เบตเปˆเบˆเบฐเบ›เบฐเบ•เบดเบšเบฑเบ” buffering เปƒเบ™เบ”เป‰เบฒเบ™เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™, เบฅเบงเบกเบ—เบฑเบ‡ buffering เปเบšเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเป‚เบ”เบเบญเบตเบ‡เบ•เบฒเบกเบเบฒเบ™เป‚เบซเบผเบ”เปƒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™, เปเบ•เปˆเบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเบ‡เปˆเบฒเบเบ”เบฒเบ, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบชเบธเบกเปƒเบชเปˆเป„เบฅเบเบฐเป€เบงเบฅเบฒเบ„เบปเบ‡เบ—เบตเปˆ.

เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ•เป‰เบญเบ‡เบ™เบฑเบšเบ—เบธเบเป†เบ™เบฒเบ—เบตเบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบชเบฑเบ™เบเบฒเบฅเบฑเบเบ‚เบฒเป€เบ‚เบปเป‰เบฒเบˆเบฒเบเบ–เบฑเบ™ sym เบŠเบธเบ”เบ‚เบญเบ‡เบŸเบฑเบ‡เบŠเบฑเบ™เบเบฒเบ™เบฅเบงเบšเบฅเบงเบก - เบฅเบฒเบ„เบฒเบชเบนเบ‡เบชเบธเบ”, เบฅเบฒเบ„เบฒเบชเบฐเป€เบฅเปˆเบ, เบ‚เบฐเบซเบ™เบฒเบ”เบฅเบงเบก, เปเบฅเบฐเบญเบทเปˆเบ™เป†. เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”. เบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเบ‡เปˆเบฒเบเบ”เบฒเบ, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบซเบ™เป‰เบฒเบ—เบตเปˆเบ—เบฑเบ‡เบซเบกเบปเบ”เบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆ incrementally, i.e. เป€เบžเบทเปˆเบญเปƒเบซเป‰เป„เบ”เป‰เบกเบนเบ™เบ„เปˆเบฒเปƒเบซเบกเปˆ, เบกเบฑเบ™เบžเบฝเบ‡เบžเปเบ—เบตเปˆเบˆเบฐเบฎเบนเป‰เบชเบญเบ‡เบ•เบปเบงเป€เบฅเบ - เบ„เปˆเบฒเป€เบเบปเปˆเบฒเปเบฅเบฐเบกเบนเบ™เบ„เปˆเบฒเบ‚เบฒเป€เบ‚เบปเป‰เบฒ. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบŸเบฑเบ‡เบŠเบฑเบ™ max, average, sum เบกเบตเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ™เบตเป‰, เปเบ•เปˆเบŸเบฑเบ‡เบŠเบฑเบ™ median เบšเปเปˆเบกเบต.

เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบˆเบฐเบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบเบฒเบ™เบ–เปˆเบฒเบเบ—เบญเบ”เบ‚เปเป‰เบกเบนเบ™เบ‚เบฒเป€เบ‚เบปเป‰เบฒเปเบกเปˆเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เป€เบงเบฅเบฒ. เบ™เบตเป‰เบˆเบฐเปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบกเบตเป‚เบญเบเบฒเบ”เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบเบžเบฝเบ‡เปเบ•เปˆเบ™เบฒเบ—เบตเบชเบธเบ”เบ—เป‰เบฒเบ. เปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”, เบกเบฑเบ™เบžเบฝเบ‡เบžเปเบ—เบตเปˆเบˆเบฐเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ™เบฒเบ—เบตเปƒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™เปเบฅเบฐเบเปˆเบญเบ™เบซเบ™เป‰เบฒเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบŠเป‰เบฒ. เบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเบ‡เปˆเบฒเบเบ”เบฒเบ, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบšเปเปˆเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบเปเบฅเบฐเบ™เบตเบ™เบตเป‰.

เบŸเบฑเบ‡เบŠเบฑเบ™เบเบฒเบ™เบฅเบงเบšเบฅเบงเบก

เบŸเบฑเบ‡เบŠเบฑเบ™เบเบฒเบ™เบฅเบงเบšเบฅเบงเบกเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เปเบกเปˆเบ™เบฅเบฐเบšเบธเป„เบงเป‰เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰. เบ‚เป‰เบญเบเป€เบญเบปเบฒเบžเบงเบเบกเบฑเบ™เบซเบผเบฒเบเป€เบ—เบปเปˆเบฒเบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เป€เบžเบทเปˆเบญเป€เบžเบตเปˆเบกเบเบฒเบ™เป‚เบซเบผเบ”เปƒเบ™เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™:

  • high โ€“ เบฅเบฒเบ„เบฒเบชเบนเบ‡เบชเบธเบ” โ€“ เบฅเบฒเบ„เบฒเบชเบนเบ‡เบชเบธเบ”เบ•เปเปˆเบ™เบฒเบ—เบต.
  • low โ€“ min price โ€“ เบฅเบฒเบ„เบฒเบ•เปเบฒเปˆเบชเบธเบ”เบ•เปเปˆเบ™เบฒเบ—เบต.
  • firstPrice โ€“ เบฅเบฒเบ„เบฒเบ—เปเบฒเบญเบดเบ” โ€“ เบฅเบฒเบ„เบฒเบ—เปเบฒเบญเบดเบ”เบ•เปเปˆเบ™เบฒเบ—เบต.
  • LastPrice - เบฅเบฒเบ„เบฒเบชเบธเบ”เบ—เป‰เบฒเบ - เบฅเบฒเบ„เบฒเบชเบธเบ”เบ—เป‰เบฒเบเบ•เปเปˆเบ™เบฒเบ—เบต.
  • firstSize - เบ‚เบฐเบซเบ™เบฒเบ”เบ—เปเบฒเบญเบดเบ” - เบ‚เบฐเบซเบ™เบฒเบ”เบเบฒเบ™เบ„เป‰เบฒเบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”เบ•เปเปˆเบ™เบฒเบ—เบต.
  • LastSize - เบ‚เบฐเบซเบ™เบฒเบ”เบชเบธเบ”เบ—เป‰เบฒเบ - เบ‚เบฐเบซเบ™เบฒเบ”เบเบฒเบ™เบ„เป‰เบฒเบชเบธเบ”เบ—เป‰เบฒเบเปƒเบ™เบซเบ™เบถเปˆเบ‡เบ™เบฒเบ—เบต.
  • numTrades โ€“ เบ™เบฑเบš i โ€“ เบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡เบเบฒเบ™เบŠเบทเป‰เบ‚เบฒเบเบ•เปเปˆเบ™เบฒเบ—เบต.
  • เบ›เบฐเบฅเบดเบกเบฒเบ™ โ€“ เบ‚เบฐเบซเบ™เบฒเบ”เบฅเบงเบก โ€“ เบœเบปเบ™เบฅเบงเบกเบ‚เบญเบ‡เบ‚เบฐเบซเบ™เบฒเบ”เบเบฒเบ™เบ„เป‰เบฒเบ•เปเปˆเบ™เบฒเบ—เบต.
  • pvolume โ€“ เบฅเบฒเบ„เบฒเบฅเบงเบก โ€“ เบœเบปเบ™เบฅเบงเบกเบ‚เบญเบ‡เบฅเบฒเบ„เบฒเบ•เปเปˆเบ™เบฒเบ—เบต, เบ•เป‰เบญเบ‡เบเบฒเบ™เบชเปเบฒเบฅเบฑเบš avgPrice.
  • โ€“ เบฅเบฒเบ„เบฒเบฅเบงเบกเบเบญเบ”เป€เบ‡เบดเบ™* เบ‚เบฐเปœเบฒเบ” โ€“ เบ›เบฐเบฅเบดเบกเบฒเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเบณเบ—เบฑเบ‡เปเบปเบ”เบ•เปเปˆเบ™เบฒเบ—เบต.
  • avgPrice โ€“ pvolume%numTrades โ€“ เบฅเบฒเบ„เบฒเบชเบฐเป€เบฅเปˆเบเบ•เปเปˆเบ™เบฒเบ—เบต.
  • avgSize โ€“ เบ›เบฐเบฅเบดเบกเบฒเบ™%numTrades โ€“ เบ‚เบฐเบซเบ™เบฒเบ”เบเบฒเบ™เบ„เป‰เบฒเบชเบฐเป€เบฅเปˆเบเบ•เปเปˆเบ™เบฒเบ—เบต.
  • vwap โ€“ turnover%volume โ€“ เบฅเบฒเบ„เบฒเบชเบฐเป€เบฅเปˆเบเบ•เปเปˆเบ™เบฒเบ—เบต เบ™เป‰เบณเปœเบฑเบเบ•เบฒเบกเบ‚เบฐเปœเบฒเบ”เบ—เบธเบฅเบฐเบเบณ.
  • cumVolume โ€“ เบ›เบฐโ€‹เบฅเบดโ€‹เบกเบฒเบ™โ€‹เบฅเบงเบก โ€“ เบ‚เบฐโ€‹เบซเบ™เบฒเบ”โ€‹เบชเบฐโ€‹เบชเบปเบกโ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เป€เบฎเบฑเบ”โ€‹เบ—เบธโ€‹เบฅเบฐโ€‹เบเปเบฒโ€‹เปƒเบ™โ€‹เป„เบฅโ€‹เบเบฐโ€‹เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”.

เปƒเบซเป‰เบ›เบถเบเบชเบฒเบซเบฒเบฅเบทเบ—เบฑเบ™เบ—เบตเบซเบ™เบถเปˆเบ‡เบˆเบธเบ”เบ—เบตเปˆเบšเปเปˆเบŠเบฑเบ”เป€เบˆเบ™ - เบงเบดเบ—เบตเบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡เบ„เปเบฅเปเบฒเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”เปเบฅเบฐเบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบ™เบฒเบ—เบตเบ•เปเปˆเบกเบฒ. เบšเบฒเบ‡เบ–เบฑเบ™เบ‚เบญเบ‡เบ›เบฐเป€เบžเบ” firstPrice เบˆเบฐเบ•เป‰เบญเบ‡เบ–เบทเบเบ•เบฑเป‰เบ‡เบ•เบปเป‰เบ™เป€เบ›เบฑเบ™ null เปเบ•เปˆเบฅเบฐเป€เบ—เบทเปˆเบญ; เบ„เปˆเบฒเบ‚เบญเบ‡เบžเบงเบเบกเบฑเบ™เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบเบณเบ™เบปเบ”. เบ›เบฐเป€เบžเบ”เบ›เบฐเบฅเบดเบกเบฒเบ™เบญเบทเปˆเบ™เป†เบ•เป‰เบญเบ‡เบ–เบทเบเบ•เบฑเป‰เบ‡เป€เบ›เบฑเบ™ 0. เบเบฑเบ‡เบกเบตเบ–เบฑเบ™เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบงเบดเบ—เบตเบเบฒเบ™เบฅเบงเบก - เบ•เบปเบงเบขเปˆเบฒเบ‡, cumVolume เบ•เป‰เบญเบ‡เบ–เบทเบเบ„เบฑเบ”เบฅเบญเบเบˆเบฒเบเบ™เบฒเบ—เบตเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ, เปเบฅเบฐเบชเปเบฒเบฅเบฑเบšเบ—เปเบฒเบญเบดเบ”เบ—เบตเปˆเบ•เบฑเป‰เบ‡เป€เบ›เบฑเบ™ 0. เปƒเบซเป‰เบเปเบฒเบ™เบปเบ”เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบ—เบฑเบ‡เบซเบกเบปเบ”เป‚เบ”เบเปƒเบŠเป‰เบ‚เปเป‰เบกเบนเบ™เบงเบฑเบ”เบˆเบฐเบ™เบฒเบ™เบธเบเบปเบก. เบ›เบฐเป€เบžเบ” (เบ›เบฝเบšเบ—เบฝเบšเบเบฑเบšเบšเบฑเบ™เบ—เบถเบ):

// 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 ะพะฑัŠััะฝะตะฝ ะฝะธะถะต

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบžเบตเปˆเบก sym เปเบฅเบฐเป€เบงเบฅเบฒเป€เบ‚เบปเป‰เบฒเปƒเบ™เบงเบฑเบ”เบˆเบฐเบ™เบฒเบ™เบธเบเบปเบกเป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเบชเบฐเบ”เบงเบ, เบ•เบญเบ™เบ™เบตเป‰ initWith เปเบกเปˆเบ™เป€เบชเบฑเป‰เบ™เบ—เบตเปˆเบเบฝเบกเบžเป‰เบญเบกเบˆเบฒเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบฅเบงเบกเบชเบธเบ”เบ—เป‰เบฒเบ, เบšเปˆเบญเบ™เบ—เบตเปˆเบกเบฑเบ™เบเบฑเบ‡เบ„เบปเบ‡เบเปเบฒเบ™เบปเบ” sym เบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เปเบฅเบฐเป€เบงเบฅเบฒ. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เบกเบฑเบ™เป€เบžเบทเปˆเบญเป€เบžเบตเปˆเบกเปเบ–เบงเปƒเบซเบกเปˆเปƒเบชเปˆเบ•เบฒเบ•เบฐเบฅเบฒเบ‡.

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™ aggCols เป€เบกเบทเปˆเบญเบชเป‰เบฒเบ‡เบŸเบฑเบ‡เบŠเบฑเบ™เบเบฒเบ™เบฅเบงเบšเบฅเบงเบก. เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ•เป‰เบญเบ‡เบ–เบทเบเบ›เบตเป‰เบ™เบเป‰เบญเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เบตเปˆเบชเบฐเปเบ”เบ‡เบญเบญเบเปƒเบ™ Q เบ–เบทเบเบ›เบฐเป€เบกเบตเบ™ (เบˆเบฒเบเบ‚เบงเบฒเบซเบฒเบŠเป‰เบฒเบ). เป€เบ›เบปเป‰เบฒเบซเบกเบฒเบเปเบกเปˆเบ™เป€เบžเบทเปˆเบญเบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบˆเบฒเบเบฅเบฐเบ”เบฑเบšเบชเบนเบ‡เป„เบ›เบซเบฒ cumVolume, เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบšเบฒเบ‡เบ–เบฑเบ™เปเบกเปˆเบ™เบ‚เบถเป‰เบ™เบเบฑเบšเปเบ–เบงเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ.

เบ–เบฑเบ™เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบ„เบฑเบ”เบฅเบญเบเป€เบ›เบฑเบ™เบ™เบฒเบ—เบตเปƒเบซเบกเปˆเบˆเบฒเบเบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ, เบ–เบฑเบ™ sym เป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบกเป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเบชเบฐเบ”เบงเบ:

rollColumns:`sym`cumVolume;

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเปเบšเปˆเบ‡เบ„เปเบฅเปเบฒเป€เบ›เบฑเบ™เบเบธเปˆเบกเบ•เบฒเบกเบงเบดเบ—เบตเบ—เบตเปˆเบžเบงเบเป€เบ‚เบปเบฒเบ„เบงเบ™เบˆเบฐเบ›เบฑเบšเบ›เบธเบ‡. เบชเบฒเบกโ€‹เบ›เบฐโ€‹เป€เบžเบ”โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบˆเปเบฒโ€‹เปเบ™เบโ€‹เป„เบ”เป‰โ€‹:

  1. เบ„เบฑเบ‡เบชเบฐเบชเบปเบก (เบ›เบฐเบฅเบดเบกเบฒเบ™, เบเบฒเบ™เบซเบฑเบ™เบ›เปˆเบฝเบ™, ..) โ€“ เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เป€เบžเบตเปˆเบกเบกเบนเบ™เบ„เปˆเบฒเบ‚เบฒเป€เบ‚เบปเป‰เบฒเบเบฑเบšเบญเบฑเบ™เบเปˆเบญเบ™เปœเป‰เบฒ.
  2. เบ”เป‰เบงเบเบˆเบธเบ”เบžเบดเป€เบชเบ” (เบชเบนเบ‡, เบ•เปเปˆเบฒ, ..) - เบ„เปˆเบฒเบ—เปเบฒเบญเบดเบ”เปƒเบ™เบ™เบฒเบ—เบตเปเบกเปˆเบ™เป€เบญเบปเบฒเบกเบฒเบˆเบฒเบเบ‚เปเป‰เบกเบนเบ™เบ‚เบฒเป€เบ‚เบปเป‰เบฒ, เบชเปˆเบงเบ™เบ—เบตเปˆเป€เบซเบผเบทเบญเปเบกเปˆเบ™เบ„เบดเบ”เป„เบฅเปˆเป‚เบ”เบเปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™.
  3. เบžเบฑเบเบœเปˆเบญเบ™. เบ„เบดเบ”เป„เบฅเปˆเบชเบฐเป€เปเบตเป‚เบ”เบเปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™.

เปƒเบซเป‰เบเปเบฒเบ™เบปเบ”เบ•เบปเบงเปเบ›เบชเปเบฒเบฅเบฑเบšเบซเป‰เบญเบ‡เบฎเบฝเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰:

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

เบ„เปเบฒเบชเบฑเปˆเบ‡เบ„เบดเบ”เป„เบฅเปˆ

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ›เบฑเบšเบ›เบธเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบฅเบงเบกเปƒเบ™เบชเบญเบ‡เบ‚เบฑเป‰เบ™เบ•เบญเบ™. เป€เบžเบทเปˆเบญเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš, เบžเบงเบเป€เบฎเบปเบฒเบ—เปเบฒเบญเบดเบ”เบซเบผเบธเบ”เบฅเบปเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ‚เบฒเป€เบ‚เบปเป‰เบฒเป€เบžเบทเปˆเบญเปƒเบซเป‰เบกเบตเบžเบฝเบ‡เปเบ•เปˆเบซเบ™เบถเปˆเบ‡เปเบ–เบงเบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบ•เบปเบงเบญเบฑเบเบชเบญเบ™เปเบฅเบฐเบ™เบฒเบ—เบต. เบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบซเบ™เป‰เบฒเบ—เบตเปˆเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™ incremental เปเบฅเบฐ associative เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบงเปˆเบฒเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เบญเบ‡เบ‚เบฑเป‰เบ™เบ•เบญเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบ™เบตเป‰เบˆเบฐเบšเปเปˆเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบซเบเปเป‰เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เป‚เบ”เบเบเบฒเบ™เป€เบฅเบทเบญเบ:

select high:max price, low:min price โ€ฆ by sym,time.minute from table

เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เบกเบตเบ‚เปเป‰เป€เบชเบ - เบŠเบธเบ”เบ‚เบญเบ‡เบ„เปเบฅเปเบฒเบ—เบตเปˆเบ„เบดเบ”เป„เบฅเปˆเปเบกเปˆเบ™เบ–เบทเบเบเปเบฒเบ™เบปเบ”เป„เบงเป‰เบฅเปˆเบงเบ‡เบซเบ™เป‰เบฒ. เป‚เบŠเบเบ”เบต, เปƒเบ™ Q, เป€เบฅเบทเบญเบเบเบฑเบ‡เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบ›เบฑเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆเบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ—เบปเบ”เปเบ—เบ™เบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡เบ—เบตเปˆเบชเป‰เบฒเบ‡เปเบšเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบง:

?[table;whereClause;byClause;selectClause]

เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบˆเบฐโ€‹เบšเปเปˆโ€‹เบญเบฐโ€‹เบ—เบดโ€‹เบšเบฒเบโ€‹เปƒเบ™โ€‹เบฅเบฒเบโ€‹เบฅเบฐโ€‹เบญเบฝเบ”โ€‹เบฎเบนเบšโ€‹เปเบšเบšโ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เป‚เบ•เป‰โ€‹เบ–เบฝเบ‡; เปƒเบ™โ€‹เบเปโ€‹เบฅเบฐโ€‹เบ™เบตโ€‹เบ‚เบญเบ‡โ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒ, เบžเบฝเบ‡โ€‹เปเบ•เปˆโ€‹เป‚เบ”เบโ€‹เปเบฅเบฐโ€‹เบเบฒเบ™โ€‹เบชเบฐโ€‹เปเบ”เบ‡โ€‹เบญเบญเบโ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เป€เบฅเบทเบญเบโ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เป€เบ›เบฑเบ™ nontrivial เปเบฅเบฐโ€‹เบžเบงเบโ€‹เป€เบ‚เบปเบฒโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบ„เบงเบ™โ€‹เบˆเบฐโ€‹เป€เบ›เบฑเบ™โ€‹เบงเบฑเบ”โ€‹เบˆเบฐโ€‹เบ™เบฒโ€‹เบ™เบธโ€‹เบเบปเบกโ€‹เบ‚เบญเบ‡โ€‹เบ–เบฑเบ™โ€‹เบฎเบนเบšโ€‹เปเบšเบš!expressions. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบซเบ™เป‰เบฒเบ—เบตเปˆเบซเบปเบ”เบ•เบปเบงเบชเบฒเบกเบฒเบ”เบ–เบทเบเบเปเบฒเบ™เบปเบ”เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

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

เป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเบŠเบฑเบ”เป€เบˆเบ™, เบ‚เป‰เบญเบเป„เบ”เป‰เปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™ parse, เป€เบŠเบดเปˆเบ‡เบ›เปˆเบฝเบ™เบชเบฐเบ•เบฃเบดเบ‡เบ—เบตเปˆเบกเบตเบเบฒเบ™เบชเบฐเปเบ”เบ‡เบœเบปเบ™ Q เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ„เปˆเบฒเบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบชเบปเปˆเบ‡เบเบฑเบšเบŸเบฑเบ‡เบŠเบฑเบ™ eval เปเบฅเบฐเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบฅเบทเบญเบ. เปƒเบซเป‰เบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒ preprocess เบ–เบทเบเบเปเบฒเบ™เบปเบ”เป€เบ›เบฑเบ™เบเบฒเบ™เบ„เบฒเบ”เบ„เบฐเป€เบ™ (i.e., เบŸเบฑเบ‡เบŠเบฑเบ™เบ—เบตเปˆเบกเบต arguments เบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เบšเบฒเบ‡เบชเปˆเบงเบ™) เบ‚เบญเบ‡เบŸเบฑเบ‡เบŠเบฑเบ™เบ—เบตเปˆเป€เบฅเบทเบญเบ, เบซเบ™เบถเปˆเบ‡ argument (เบ•เบฒเบ•เบฐเบฅเบฒเบ‡) เบซเบฒเบเป„เบ›. เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเบ™เปเบฒเปƒเบŠเป‰ preprocess เบเบฑเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡ compressed.

เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เบตเบชเบญเบ‡เปเบกเปˆเบ™เบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบฅเบงเบก. เบ—เปเบฒเบญเบดเบ”เปƒเบซเป‰เบ‚เบฝเบ™ algorithm เปƒเบ™ 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];
  โ€ฆ

เปƒเบ™ Q, เบกเบฑเบ™เป€เบ›เบฑเบ™เป€เบฅเบทเปˆเบญเบ‡เบ—เปเบฒเบกเบฐเบ”เบฒเบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เบซเบ™เป‰เบฒเบ—เบตเปˆเปเบœเบ™เบ—เบตเปˆ / เบซเบผเบธเบ”เบœเปˆเบญเบ™เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™ loops. เปเบ•เปˆเป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒ Q เป€เบ›เบฑเบ™เบžเบฒเบชเบฒ vector เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เป„เบ”เป‰เบขเปˆเบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบเบเบฑเบšเบชเบฑเบ™เบเบฒเบฅเบฑเบเบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบง, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เป€เบžเบทเปˆเบญเบ›เบฐเบกเบฒเบ™เบ—เปเบฒเบญเบดเบ”เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™ loop เบ—เบฑเบ‡เบซเบกเบปเบ”, เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบเปˆเบฝเบงเบเบฑเบšเบชเบฑเบ™เบเบฒเบฅเบฑเบเบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™:

idx:calcIdx inputTable;
row:aggTable idx;
aggTable[idx;`high]: row[`high] | inputTable`high;
aggTable[idx;`volume]: row[`volume] + inputTable`volume;
โ€ฆ

เปเบ•เปˆเบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป„เบ›เบ•เบทเปˆเบกเบญเบตเบ, Q เบกเบตเบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฑเบเปเบฅเบฐเบกเบตเบญเปเบฒเบ™เบฒเบ”เบ—เบตเปˆเบชเบธเบ” - เบœเบนเป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบกเบญเบšเบซเบกเบฒเบเป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›. เบกเบฑเบ™เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบ›เปˆเบฝเบ™เบŠเบธเบ”เบ‚เบญเบ‡เบ„เปˆเบฒเปƒเบ™เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เปเป‰เบกเบนเบ™เบชเบฐเบฅเบฑเบšเบชเบฑเบšเบŠเป‰เบญเบ™เป‚เบ”เบเปƒเบŠเป‰เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบ•เบปเบงเบŠเบตเป‰เบงเบฑเบ”, เบซเบ™เป‰เบฒเบ—เบตเปˆเปเบฅเบฐเบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบกเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒ:

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;โ€ฆ)];

เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เป€เบžเบทเปˆเบญเบเปเบฒเบ™เบปเบ”เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เปเบ–เบง, เบšเปเปˆเปเบกเปˆเบ™เบ„เปเบฅเปเบฒ, เปเบฅเบฐเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡ transpose matrix (เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบ–เบฑเบ™เป„เบ›เบซเบฒเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เปเบ–เบง) เป‚เบ”เบเปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™ flip. เบ™เบตเป‰เปเบกเปˆเบ™เบฅเบฒเบ„เบฒเปเบžเบ‡เบชเปเบฒเบฅเบฑเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆ, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเบžเบงเบเป€เบฎเบปเบฒเบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เบกเบญเบšเบซเบกเบฒเบเบ—เบปเปˆเบงเป„เบ›เปƒเบ™เปเบ•เปˆเบฅเบฐเบ„เปเบฅเปเบฒเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ, เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบซเบ™เป‰เบฒเบ—เบตเปˆเปเบœเบ™เบ—เบตเปˆ (เป€เบŠเบดเปˆเบ‡เบ„เป‰เบฒเบเบ„เบท apostrophe):

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

เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰เบเบฒเบ™เบ„เบฒเบ”เบเบฒเบ™เบŸเบฑเบ‡เบŠเบฑเบ™เบญเบตเบเบ„เบฑเป‰เบ‡. เปƒเบซเป‰เบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเปƒเบ™ Q, เบเบฒเบ™เบชเป‰เบฒเบ‡เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบเบฑเบ‡เป€เบ›เบฑเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆเปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป‚เบ—เบซเบฒเบกเบฑเบ™เป‚เบ”เบเปƒเบŠเป‰เปเบ•เปˆเบฅเบฐเบซเบ™เป‰เบฒเบ—เบตเปˆ (เปเบœเบ™เบ—เบตเปˆ) เป€เบžเบทเปˆเบญเปƒเบซเป‰เป„เบ”เป‰เบฎเบฑเบšเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบฅเบฒเบเบŠเบทเปˆ.

เป€เบžเบทเปˆเบญเปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบŠเบธเบ”เบ‚เบญเบ‡เบ„เปเบฅเปเบฒเบ—เบตเปˆเบ„เบดเบ”เป„เบฅเปˆเบšเปเปˆเป„เบ”เป‰เบ–เบทเบเปเบเป‰เป„เบ‚, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบชเป‰เบฒเบ‡เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เปเบšเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบง. เบ—เปเบฒเบญเบดเบ”เปƒเบซเป‰เบเปเบฒเบ™เบปเบ”เบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบžเบทเปˆเบญเบ„เบดเบ”เป„เบฅเปˆเปเบ•เปˆเบฅเบฐเบ–เบฑเบ™, เป‚เบ”เบเปƒเบŠเป‰เปเบ–เบงเปเบฅเบฐเบ•เบปเบงเปเบ› inp เป€เบžเบทเปˆเบญเบญเป‰เบฒเบ‡เบญเบตเบ‡เป€เบ–เบดเบ‡เบ‚เปเป‰เบกเบนเบ™เบฅเบงเบกเปเบฅเบฐเบเบฒเบ™เบ›เป‰เบญเบ™เบ‚เปเป‰เบกเบนเบ™:

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

เบšเบฒเบ‡เบ–เบฑเบ™เปเบกเปˆเบ™เบžเบดเป€เบชเบ”; เบ„เปˆเบฒเบ—เบณเบญเบดเบ”เบ‚เบญเบ‡เบžเบงเบเบกเบฑเบ™เบšเปเปˆเบ„เบงเบ™เบ–เบทเบเบ„เบณเบ™เบงเบ™เป‚เบ”เบเบŸเบฑเบ‡เบŠเบฑเบ™. เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เบงเปˆเบฒเบกเบฑเบ™เป€เบ›เบฑเบ™เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”เป‚เบ”เบเบ–เบฑเบ™เปเบ–เบง [`numTrades] - เบ–เป‰เบฒเบกเบฑเบ™เบกเบต 0, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบกเบนเบ™เบ„เปˆเบฒเปเบกเปˆเบ™เบ—เปเบฒเบญเบดเบ”. Q เบกเบตเบŸเบฑเบ‡เบŠเบฑเบ™เป€เบฅเบทเบญเบ - ?[เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆ boolean;list1;list2] - เป€เบŠเบดเปˆเบ‡เป€เบฅเบทเบญเบเบ„เปˆเบฒเบˆเบฒเบเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆ 1 เบซเบผเบท 2 เบ‚เบถเป‰เบ™เบเบฑเบšเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เปƒเบ™เบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡เบ—เปเบฒเบญเบดเบ”:

// high -> ?[isFirst;inp`high;row[`high]|inp`high]
// @ - ั‚ะพะถะต ะพะฑะพะฑั‰ะตะฝะฝะพะต ะฟั€ะธัะฒะฐะธะฒะฐะฝะธะต ะดะปั ัะปัƒั‡ะฐั ะบะพะณะดะฐ ะธะฝะดะตะบั ะฝะตะณะปัƒะฑะพะบะธะน
@[`aggExpression;specialCols;{[x;y]"?[isFirst;inp`",y,";",x,"]"};string specialCols];

เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบ‚เป‰เบญเบเป€เบญเบตเป‰เบ™เบงเปˆเบฒเบเบฒเบ™เบกเบญเบšเบซเบกเบฒเบเป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›เบเบฑเบšเบซเบ™เป‰เบฒเบ—เบตเปˆเบ‚เบญเบ‡เบ‚เป‰เบญเบ (เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบเปƒเบ™เบงเบปเบ‡เป€เบฅเบฑเบš curly). เบกเบฑเบ™เป„เบ”เป‰เบฎเบฑเบšเบกเบนเบ™เบ„เปˆเบฒเบ›เบฐเบˆเบธเบšเบฑเบ™ (เบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡เบ—เปเบฒเบญเบดเบ”) เปเบฅเบฐเบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡เป€เบžเบตเปˆเบกเป€เบ•เบตเบก, เบ—เบตเปˆเบ‚เป‰เบญเบเบœเปˆเบฒเบ™เปƒเบ™เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ—เบต 4.

เปƒเบซเป‰เป€เบžเบตเปˆเบกเบฅเปเบฒเป‚เบžเบ‡เบซเบกเปเป‰เป„เบŸเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ, เป€เบžเบฒเบฐเบงเปˆเบฒเบŸเบฑเบ‡เบŠเบฑเบ™เปเบกเปˆเบ™เบ„เบทเบเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบžเบงเบเป€เบ‚เบปเบฒ:

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

เบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เบกเบญเบšเบซเบกเบฒเบเบ›เบปเบเบเบฐเบ•เบดเป‚เบ”เบเบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™ Q, เปเบ•เปˆเบ‚เป‰เบญเบเบเปเบฒเบฅเบฑเบ‡เบเปเบฒเบ™เบปเบ”เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบ„เปˆเบฒเปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™. เบชเบธเบ”เบ—เป‰เบฒเบ, เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆเบ•เบปเป‰เบ™เบ•เป:

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

เบ”เป‰เบงเบเบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบเบ™เบตเป‰, เบ‚เป‰เบญเบเบชเป‰เบฒเบ‡เบŸเบฑเบ‡เบŠเบฑเบ™เปเบšเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบˆเบฒเบเบชเบฐเบ•เบฃเบดเบ‡เบ—เบตเปˆเบกเบตเบเบฒเบ™เบชเบฐเปเบ”เบ‡เบ—เบตเปˆเบ‚เป‰เบญเบเปƒเบซเป‰เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡. เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบˆเบฐเบกเบตเบฅเบฑเบเบชเบฐเบ™เบฐเบ™เบตเป‰:

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

เบฅเบณเบ”เบฑเบšเบเบฒเบ™เบ›เบฐเป€เบกเบตเบ™เบ–เบฑเบ™เปเบกเปˆเบ™เบ›เบตเป‰เบ™เบเบฑเบšเบเบฑเบ™ เป€เบžเบฒเบฐเบงเปˆเบฒเปƒเบ™ Q เบฅเบณเบ”เบฑเบšเบเบฒเบ™เบ›เบฐเป€เบกเบตเบ™เปเบกเปˆเบ™เบกเบฒเบˆเบฒเบเบ‚เบงเบฒเบซเบฒเบŠเป‰เบฒเบ.

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบชเบญเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆเบ•เบปเป‰เบ™เบ•เปเบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆ, เบžเบงเบเป€เบฎเบปเบฒเบžเบฝเบ‡เปเบ•เปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบžเบตเปˆเบกเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™เป€เบฅเบฑเบเบ™เป‰เบญเบเปเบฅเบฐเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เปเบกเปˆเบ™เบเบฝเบกเบžเป‰เบญเบก.

เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบชเบธเบ”เบ—เป‰เบฒเบ

เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบซเบ™เป‰เบฒเบ—เบตเปˆ preprocess เปเบฅเบฐ updateAgg เบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบ—เบฑเบ‡เบซเบกเบปเบ”. เปเบ•เปˆเบกเบฑเบ™เบเบฑเบ‡เบกเบตเบ„เบงเบฒเบกเบˆเปเบฒเป€เบ›เบฑเบ™เป€เบžเบทเปˆเบญเบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบเบฒเบ™เบซเบฑเบ™เบ›เปˆเบฝเบ™เบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เบœเปˆเบฒเบ™เบ™เบฒเบ—เบตเปเบฅเบฐเบ„เบดเบ”เป„เบฅเปˆเบ”เบฑเบ”เบชเบฐเบ™เบตเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบฅเบงเบšเบฅเบงเบก. เบเปˆเบญเบ™เบญเบทเปˆเบ™ เปเบปเบ”, เปƒเบซเป‰ เบเบณ เบ™เบปเบ”เบŸเบฑเบ‡เบŠเบฑเบ™ 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
 }

เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบˆเบฐเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ—เปเบฒเบ‡เบฒเบ™เบ‚เบญเบ‡เบกเป‰เบงเบ™, เป€เบŠเบดเปˆเบ‡เบˆเบฐเบ›เปˆเบฝเบ™เบ™เบฒเบ—เบตเบ›เบฐเบˆเบธเบšเบฑเบ™:

roll:{[tm]
  if[currTime>tm; :init[]]; // ะตัะปะธ ะฟะตั€ะตะฒะฐะปะธะปะธ ะทะฐ ะฟะพะปะฝะพั‡ัŒ, ั‚ะพ ะฟั€ะพัั‚ะพ ะฒั‹ะทะพะฒะตะผ init
  rollCache,::offset _ rollColumns#tradeAgg; // ะพะฑะฝะพะฒะธะผ ะบััˆ โ€“ ะฒะทัั‚ัŒ roll ะบะพะปะพะฝะบะธ ะธะท aggTable, ะพะฑั€ะตะทะฐั‚ัŒ, ะฒัั‚ะฐะฒะธั‚ัŒ ะฒ rollCache
  offset::count tradeAgg;
  currSyms::`u#`$();
 }

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™เบŸเบฑเบ‡เบŠเบฑเบ™เป€เบžเบทเปˆเบญเป€เบžเบตเปˆเบกเบ•เบปเบงเบญเบฑเบเบชเบญเบ™เปƒเบซเบกเปˆ:

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

เปเบฅเบฐเบชเบธเบ”เบ—เป‰เบฒเบ, เบŸเบฑเบ‡เบŠเบฑเบ™ upd (เบŠเบทเปˆเปเบšเบšเบ”เบฑเป‰เบ‡เป€เบ”เบตเบกเบชเปเบฒเบฅเบฑเบšเบŸเบฑเบ‡เบŠเบฑเบ™เบ™เบตเป‰เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™ Q), เป€เบŠเบดเปˆเบ‡เบ–เบทเบเป€เบญเบตเป‰เบ™เป‚เบ”เบเบฅเบนเบเบ„เป‰เบฒเป€เบžเบทเปˆเบญเป€เบžเบตเปˆเบกเบ‚เปเป‰เบกเบนเบ™:

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]; // ะพะฑะฝะพะฒะธะผ ะฐะณั€ะตะณะธั€ะพะฒะฐะฝะฝัƒัŽ ั‚ะฐะฑะปะธั†ัƒ. ะคัƒะฝะบั†ะธั ? ะธั‰ะตั‚ ะธะฝะดะตะบั ัะปะตะผะตะฝั‚ะพะฒ ัะฟะธัะบะฐ ัะฟั€ะฐะฒะฐ ะฒ ัะฟะธัะบะต ัะปะตะฒะฐ.
 };

เบซเบกเบปเบ”โ€‹เป€เบ—เบปเปˆเบฒโ€‹เบ™เบตเป‰. เบ™เบตเป‰เปเบกเปˆเบ™เบฅเบฐเบซเบฑเบ”เบ„เบปเบšเบ–เป‰เบงเบ™เบ‚เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เบ•เบฒเบกเบ—เบตเปˆเบชเบฑเบ™เบเบฒเป„เบงเป‰, เบžเบฝเบ‡เปเบ•เปˆเบชเบญเบ‡เบชเบฒเบกเบชเบฒเบ:

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

เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš

เปƒเบซเป‰เบเบงเบ”เป€เบšเบดเปˆเบ‡เบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบ‚เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™. เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เปƒเบซเป‰เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เปƒเบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ (เปƒเบชเปˆเบฅเบฐเบซเบฑเบ”เปƒเบ™เป„เบŸเบฅเปŒ service.q) เปเบฅเบฐเป‚เบ—เบซเบฒเบซเบ™เป‰เบฒเบ—เบตเปˆ init:

q service.q โ€“p 5566

q)init[]

เปƒเบ™ console เบญเบทเปˆเบ™, เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™ Q เบ—เบตเบชเบญเบ‡เปเบฅเบฐเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”:

h:hopen `:host:5566
h:hopen 5566 // ะตัะปะธ ะพะฑะฐ ะฝะฐ ะพะดะฝะพะผ ั…ะพัั‚ะต

เบ—เปเบฒเบญเบดเบ”, เปƒเบซเป‰เบชเป‰เบฒเบ‡เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบชเบฑเบ™เบเบฒเบฅเบฑเบ - 10000 เบŠเบดเป‰เบ™เปเบฅเบฐเป€เบžเบตเปˆเบกเบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปเบšเบšเบชเบธเปˆเบก. เปƒเบ™ console เบ—เบตเบชเบญเบ‡:

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

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบžเบตเปˆเบกเบชเบฒเบกเบชเบฑเบ™เบเบฒเบฅเบฑเบเบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡เปƒเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เบ‡เปˆเบฒเบเบ•เปเปˆเบเบฒเบ™เบŠเบญเบเบซเบฒเบžเบงเบเบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡. เบŸเบฑเบ‡เบŠเบฑเบ™ rnd เบชเป‰เบฒเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปเบšเบšเบชเบธเปˆเบกเบ—เบตเปˆเบกเบต n เปเบ–เบง, เบšเปˆเบญเบ™เบ—เบตเปˆเป€เบงเบฅเบฒเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบˆเบฒเบ t เบซเบฒ t + 25 เบกเบดเบ™เบฅเบดเบงเบดเบ™เบฒเบ—เบต.

เบ•เบญเบ™เบ™เบตเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบฅเบญเบ‡เบชเบปเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เป„เบ›เบซเบฒเบšเปเบฅเบดเบเบฒเบ™ (เป€เบžเบตเปˆเบกเบชเบดเบšเบŠเบปเปˆเบงเป‚เบกเบ‡เบ—เปเบฒเบญเบดเบ”):

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

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเบงเบ”เบชเบญเบšเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ—เบตเปˆเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เป„เบ”เป‰เบ–เบทเบเบ›เบฑเบšเบ›เบธเบ‡:

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

เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš:

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

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เป€เบฎเบฑเบ”เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบเบฒเบ™เป‚เบซเบผเบ”เป€เบžเบทเปˆเบญเบŠเบญเบเบซเบฒเบงเปˆเบฒเบšเปเบฅเบดเบเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ‚เปเป‰เบกเบนเบ™เบซเบผเบฒเบเบ›เบฒเบ™เปƒเบ”เบ•เปเปˆเบ™เบฒเบ—เบต. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ‚เปเป€เบ•เบทเบญเบ™เบ—เปˆเบฒเบ™เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบ™เบปเบ”เป„เบฅเบเบฐเบเบฒเบ™เบญเบฑเบšเป€เบ”เบ”เป€เบ›เบฑเบ™ 25 milliseconds. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ•เป‰เบญเบ‡ (เป‚เบ”เบเบชเบฐเป€เบฅเปˆเบ) เป€เบซเบกเบฒเบฐเบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบ 20 milliseconds เบ•เปเปˆเบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡เป€เบžเบทเปˆเบญเปƒเบซเป‰เบœเบนเป‰เปƒเบŠเป‰เปƒเบŠเป‰เป€เบงเบฅเบฒเปƒเบ™เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ‚เปเป‰เบกเบนเบ™. เบเบฐเบฅเบธเบ™เบฒเปƒเบชเปˆเบ•เปเปˆเป„เบ›เบ™เบตเป‰เปƒเบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ—เบตเบชเบญเบ‡:

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 เปเบกเปˆเบ™เบชเบญเบ‡เบ™เบฒเบ—เบต. เบ—เปˆเบฒเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบžเบฐโ€‹เบเบฒโ€‹เบเบฒเบกโ€‹เปเบฅเปˆเบ™โ€‹เบ„เบฑเป‰เบ‡โ€‹เบ—เปเบฒโ€‹เบญเบดเบ”โ€‹เบชเปเบฒโ€‹เบฅเบฑเบš 1000 เปเบ–เบงโ€‹เปƒเบ™โ€‹เบ—เบธเบเป† 25 millisecondsโ€‹:

start 1000

เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบ‚เป‰เบญเบ, เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเปเบกเปˆเบ™เบ›เบฐเบกเบฒเบ™เบชเบญเบ‡เบชเบฒเบกเบกเบดเบฅเบดเบงเบดเบ™เบฒเบ—เบตเบ•เปเปˆเบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ‚เป‰เบญเบเบˆเบฐเป€เบžเบตเปˆเบกเบˆเปเบฒเบ™เบงเบ™เปเบ–เบงเป€เบ›เบฑเบ™ 10.000 เบ—เบฑเบ™เบ—เบต:

start 10000

เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš:

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

เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡, เบšเปเปˆเบกเบตเบซเบเบฑเบ‡เบžเบดเป€เบชเบ”, เปเบ•เปˆเบ™เบตเป‰เปเบกเปˆเบ™ 24 เบฅเป‰เบฒเบ™เบชเบฒเบเบ•เปเปˆเบ™เบฒเบ—เบต, 400 เบžเบฑเบ™เบ•เปเปˆเบงเบดเบ™เบฒเบ—เบต. เบชเปเบฒเบฅเบฑเบšเป€เบงเบฅเบฒเบซเบผเบฒเบเบเบงเปˆเบฒ 25 เบกเบดเบ™เบฅเบดเบงเบดเบ™เบฒเบ—เบต, เบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡เบŠเป‰เบฒเบฅเบปเบ‡เบžเบฝเบ‡เปเบ•เปˆ 5 เป€เบ—เบทเปˆเบญ, เบ›เบฒเบเบปเบ”เบ‚เบทเป‰เบ™เป€เบกเบทเปˆเบญเบ™เบฒเบ—เบตเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡. เปƒเบซเป‰เป€เบžเบตเปˆเบกเป€เบ›เบฑเบ™ 100.000:

start 100000

เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš:

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

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰, เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เป€เบเบทเบญเบšเบšเปเปˆเบชเบฒเบกเบฒเบ”เบฎเบฑเบšเบกเบทเบเบฑเบšเป„เบ”เป‰, เปเบ•เปˆเบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบกเบกเบฑเบ™เบเปเปˆเบชเบฒเบกเบฒเบ”เบขเบนเปˆเป„เบ”เป‰. เบ›เบฐเบฅเบดเบกเบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง (240 เบฅเป‰เบฒเบ™เปเบ–เบงเบ•เปเปˆเบ™เบฒเบ—เบต) เปเบกเปˆเบ™เบกเบตเบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเบ—เบตเปˆเบชเบธเบ”; เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ”เบฑเปˆเบ‡เบเปˆเบฒเบง, เบกเบฑเบ™เป€เบ›เบฑเบ™เป€เบฅเบทเปˆเบญเบ‡เบ›เบปเบเบเบฐเบ•เบดเบ—เบตเปˆเบˆเบฐเป€เบ›เบตเบ”เบ•เบปเบง clones เบซเบผเบฒเบ (เบซเบผเบทเปเบกเป‰เบเบฐเบ—เบฑเป‰เบ‡เบซเบผเบฒเบเบชเบดเบš clones) เบ‚เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™, เปเบ•เปˆเบฅเบฐเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบšเบฒเบ‡เบชเปˆเบงเบ™เบ‚เบญเบ‡เบ•เบปเบงเบญเบฑเบเบชเบญเบ™. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเปเบกเปˆเบ™เบ›เบฐเบ—เบฑเบšเปƒเบˆเบชเปเบฒเบฅเบฑเบšเบžเบฒเบชเบฒเบ—เบตเปˆเบ•เบตเบ„เบงเบฒเบกเบซเบกเบฒเบเบ—เบตเปˆเบชเบธเบกเปƒเบชเปˆเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ‚เปเป‰เบกเบนเบ™เบ•เบปเป‰เบ™เบ•เป.

เบ„เปเบฒเบ–เบฒเบกเบญเบฒเบ”เบˆเบฐเป€เบเบตเบ”เบ‚เบทเป‰เบ™เบงเปˆเบฒเป€เบ›เบฑเบ™เบซเบเบฑเบ‡เป€เบงเบฅเบฒเป€เบ•เบตเบšเป‚เบ•เบšเปเปˆเบเบปเบ‡เบเบฑเบšเบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡เปเบ•เปˆเบฅเบฐเบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡. เป€เบซเบ”เบœเบปเบ™เปเบกเปˆเบ™เบงเปˆเบฒเบซเบ™เป‰เบฒเบ—เบตเปˆเบซเบปเบ”เบ•เบปเบงเบ•เบปเบงเบˆเบดเบ‡เปเบกเปˆเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆ C, เป€เบŠเบดเปˆเบ‡เบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบซเบผเบฒเบเบเปˆเบงเบฒ updateAgg. เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบˆเบฒเบเบ‚เบฐเบซเบ™เบฒเบ”เบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡เบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™ (เบ›เบฐเบกเบฒเบ™ 10.000), updateAgg เบฎเบญเบ”เป€เบžเบ”เบฒเบ™เบ‚เบญเบ‡เบกเบฑเบ™เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เป€เบงเบฅเบฒเบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบกเบฑเบ™เบšเปเปˆเบ‚เบถเป‰เบ™เบเบฑเบšเบ‚เบฐเบซเบ™เบฒเบ”เบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡. เบกเบฑเบ™เปเบกเปˆเบ™เบเป‰เบญเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™ Q เบ—เบตเปˆเบšเปเบฅเบดเบเบฒเบ™เบชเบฒเบกเบฒเบ”เบเปˆเบญเบเบ›เบฐเบฅเบดเบกเบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเป„เบ”เป‰. เบ™เบตเป‰เบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™เป€เบ–เบดเบ‡เบ„เบงเบฒเบกเบชเปเบฒเบ„เบฑเบ™เบงเปˆเบฒเบกเบฑเบ™เบกเบตเบ„เบงเบฒเบกเบชเปเบฒเบ„เบฑเบ™เปเบ™เบงเปƒเบ”เบ—เบตเปˆเบˆเบฐเป€เบฅเบทเบญเบเป€เบญเบปเบฒเบชเบนเบ”เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เปƒเบซเบเปˆ. เบญเบตเบเบˆเบธเบ”เบซเบ™เบถเปˆเบ‡เปเบกเปˆเบ™เบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เปƒเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒ. เบ–เป‰เบฒเบ‚เปเป‰เบกเบนเบ™เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เบ–เบฑเบ™เบซเบผเบทเบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบˆเบฑเบ”เบฅเปเบฒเบ”เบฑเบšเบ•เบฒเบกเป€เบงเบฅเบฒ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ„เบธเป‰เบ™เป€เบ„เบตเบเบเบฑเบšเบชเบดเปˆเบ‡เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเป€เบ›เบฑเบ™ TLB cache miss - เบเบฒเบ™เบ‚เบฒเบ”เบ—เบตเปˆเบขเบนเปˆเบซเบ™เป‰เบฒเบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเปƒเบ™ cache เบ—เบตเปˆเบขเบนเปˆ processor. เบเบฒเบ™เบŠเบญเบเบซเบฒเบ—เบตเปˆเบขเบนเปˆเปƒเบŠเป‰เป€เบงเบฅเบฒเบ›เบฐเบกเบฒเบ™ 30 เป€เบ—เบปเปˆเบฒเบ–เป‰เบฒเบšเปเปˆเบชเปเบฒเป€เบฅเบฑเบ”, เปเบฅเบฐเบ–เป‰เบฒเบ‚เปเป‰เบกเบนเบ™เบเบฐเปเบˆเบเบเบฐเบˆเบฒเบ, เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบŠเป‰เบฒเบฅเบปเบ‡เบซเบผเบฒเบเบ„เบฑเป‰เบ‡.

เบชเบฐเบซเบฅเบธเบš

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบงเปˆเบฒเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ KDB + เปเบฅเบฐ Q เปเบกเปˆเบ™เป€เบซเบกเบฒเบฐเบชเบปเบกเบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ‚เปเป‰เบกเบนเบ™เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเปเบฅเบฐเป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป„เบ”เป‰เบ‡เปˆเบฒเบเป‚เบ”เบเบœเปˆเบฒเบ™เบเบฒเบ™เป€เบฅเบทเบญเบ, เปเบ•เปˆเบเบฑเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบเปˆเบญเบเบซเบผเบฒเบเบฎเป‰เบญเบเบฅเป‰เบฒเบ™เปเบ–เบง / gigabyte เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเปƒเบ™. เบ‚เบฐเบšเบงเบ™เบเบฒเบ™ Q เบ”เบฝเบง. เบžเบฒเบชเบฒ Q เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบขเปˆเบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบเปเบฅเบฐเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบ‚เบญเบ‡ algorithms เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ‚เปเป‰เบกเบนเบ™เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบฅเบฑเบเบชเบฐเบ™เบฐเบ‚เบญเบ‡ vector เบ‚เบญเบ‡เบกเบฑเบ™, เบ•เบปเบงเปเบ›เบžเบฒเบชเบฒเบžเบฒเบชเบฒ SQL เปเบฅเบฐเบŠเบธเบ”เบ—เบตเปˆเบ›เบฐเบชเบปเบšเบœเบปเบ™เบชเปเบฒเป€เบฅเบฑเบ”เบซเบผเบฒเบเบ‚เบญเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”.

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบ™เบตเป‰เปเบกเปˆเบ™เบžเบฝเบ‡เปเบ•เปˆเบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆ Q เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰, เบกเบฑเบ™เบกเบตเบฅเบฑเบเบชเบฐเบ™เบฐเบžเบดเป€เบชเบ”เบญเบทเปˆเบ™เป†เป€เบŠเบฑเปˆเบ™เบเบฑเบ™. เบ•เบปเบงเบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™, เป‚เบ›เป‚เบ•เบ„เบญเบ™ IPC เบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบเบ—เบตเปˆเบชเบธเบ”เบ—เบตเปˆเบˆเบฐเบฅเบปเบšเบฅเป‰เบฒเบ‡เบ‚เบญเบšเป€เบ‚เบ”เบฅเบฐเบซเบงเปˆเบฒเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™ Q เบชเปˆเบงเบ™เบšเบธเบเบ„เบปเบ™เปเบฅเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบฅเบงเบกเป€เบญเบปเบฒเบซเบผเบฒเบเบฎเป‰เบญเบเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ”เบฝเบง, เป€เบŠเบดเปˆเบ‡เบชเบฒเบกเบฒเบ”เบ•เบฑเป‰เบ‡เบขเบนเปˆเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบซเบผเบฒเบเบชเบดเบšเบซเบ™เปˆเบงเบเปƒเบ™เบชเปˆเบงเบ™เบ•เปˆเบฒเบ‡เป†เบ‚เบญเบ‡เป‚เบฅเบ.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™