標籤:

KDB+的RDB實現

話說,開通專欄【磨人的KDB+】時,第一次申請居然沒通過,背景描述是個謎。

最近發生了很多事情,導致沉迷於吃雞一天半,然後刪掉再也不碰。有機會做個PPT把吃雞和期權結合一下做個H5展示應該很有意思。

在完成主要內容之前,有個好消息:KDB+官方放出了64位的個人免費版使用,不再有4GB內存的限制(跪下磕頭感謝),但是最多兩台電腦,16核,且不能用於雲(32位的可以在雲上運行)。按照官網給的鏈接申請就行,應該需要科學上網來獲取人機驗證。

RDB實現

RealTime DataBase將接收到的數據進行實時保存,即實現 intraday writedown。且看如下代碼(參照官網Whitepapers所給的方法):

/ 每隔5min寫入磁碟,並將內存buffer5min前的清空writedown:{[t] / find if any rows older than 5 mins if[(first t`RealTime) <minT:.z.P-00:05; / append enumerated buffer to disk cnt:count tab:select from t where time<minT; .[` sv TMPSAVE,t,`;();,;.Q.en[`:.] tab]; / clear buffer @[`.;t;cnt _]; ]};

我們來解釋一下這些符號都是些啥意思:

/ writedown 是個函數,輸入參數是 t,函數體用{}包含if[...;...]/ 條件判斷語句,分號前面的為判斷條件,後面的是為True時的執行代碼,沒有else分支/ 想用else分支要用 $[...;...;...] 語句(first t`RealTime) <minT:.z.P-00:05/ q語言執行順序為從右到左,除了括弧以外沒有運算符優先/ .z.P為當前本地時間,顯示位數到nanosecond,譬如2018.03.29D18:03:30.230380000/ t在這裡是一個table,類似於其他資料庫中的表/ t`RealTime表示取出欄位名為RealTime的所有數據,然後first一下表示取出第一個數據cnt:count tab:select from t where time<minT/ 正常的SQL查詢,查詢結果賦值給tab/ count一下tab,即得到tab這個表的條目數,將結果賦值給cnt.[` sv TMPSAVE,t,`;();,;.Q.en[`:.] tab]/ 這裡就能體現出kdb+的反人類了,變數只有三個: TMPSAVE, t, tab/ TMPSAVE為臨時磁碟存儲的路徑string/ ` sv TMPSAVE,t,` 表示將路徑string轉變為真正的路徑/ .Q.en[`:.] tab 表示 enumerate varchar columns in the tab 並保存在磁碟上,`:.表示當前文件路徑/ 最外層 .[...;();,;...] 表示 dot amend,即將最後一個分號後的數據append到第一個分號前的數據里@[`.;t;cnt _]/ t中的cnt個條目刪除

然後在記錄結束後,將所有臨時保存的數據轉入HDB (History Database),這個就自己體會啦:

end:{ / end of day: save, clear, sort on disk, move, hdb reload t:tables`.;t@:where `g=attr each t@:`sym; / append enumerated buffer to disk for write tables {.[` sv TMPSAVE,x,`;();,;.Q.en[`:.]`. x]} each WRITETBLS; / clear buffer for write tables @[`.;WRITETBLS;0#]; / write normal tables down in usual manner {[x;t].Q.dpft[`:.;x;`sym;] each WRITETBLS;@[`.;t;0#]}[x;] each t except WRITETBLS; / special logic to sort and move tmp tables to hdb .u.endWTbls[x;WRITETBLS]; / reapply grouped attribute @[;`sym;`g#] each WRITETBLS; / and notify hdb to reload and pick up new partition if[h:@[hopen;`$":","localhost:5012";0];h"\l .";hclose h]; };

接下來的計劃

KDB+都出64位了,下一步希望基於q語言開發一套交易系統。調用CTP 64位的dll來接收行情及報撤單等,策略、倉位管理、風控結算及日誌部分就用q來寫。當然什麼時候開始動手就是又一個緣分了。


推薦閱讀:

OceanBase:當金融擁抱科技
什麼鬼!基於備份恢復的數據還能變多?
為什麼Docker容器不適合資料庫服務(一)
設計數據密集型應用-DDIA中文翻譯
深入淺出hbase和bigtable

TAG:資料庫 |