2017-08-16 85 views
0

給你一點背景。我有一個過程需要一段時間才能完成這個大型的複雜計算。它運行在一個計時器上。經過一番調查後,我意識到造成緩慢的原因並不是實際計算,而是內部q函數union。kdb +/q優化聯合函數

我想聯合兩個簡單的表,表A和表B. A是約5米行和B是500.兩個表都只有兩列。第一列是一個符號。表A實際上是表的複合主鍵。 (另外,你怎麼直接從控制檯複製?)

n:5000000 
big:([]n?`4;n?100) 
small:([]500?`4;500?100) 
\ts big union small 

我試圖鍵控列和upserting,加入再不同,「大,小地方的大不小」,但似乎沒有任何工作:(

任何幫助將不勝感激!

回答

0

如果你想UPSERT的big表它必須鍵入和upsert經營者應當使用。例如

n:5000000 
//big ids are unique numbers from 0 to 499999 
//table is keyed with 1! operator 
big:1!([]id:(neg n)?n;val:n?100) 
//big ids are unique numbers. 250 from 0-4999999 and 250 from 500000-1000000 intervals 
small:([]id:(-250?n),(n+-250?n);val:500?100) 

如果big是全局變量是有效的UPSERT它作爲

`big upsert small 

如果big是本地

big: big upsert small 

其結果big將具有500250層的元件,因爲有250個共同密鑰(id列)在大小桌子上

0

這可能不相關,但只是一個快速的想法。如果你的大表有一個類型爲sym的列,並且如果這個列在整個程序中沒有顯示出那麼多,爲什麼不把它轉換爲字符串或其他值呢?如果你每天都在做這個更新過程,那麼當數據被打包到分區的hdb中時,無論何時添加新數據,kdb +進程都必須重新分配/重寫它的sym文件,我相信這是實際需要的部分的時間,而不是聯盟計算本身..

如果上面是真實的,我會建議要麼重寫您的架構的表最小化#重新散列(不知道這是否是正確的術語!)您的sym文件。或者,正如上面提到的人一樣,嘗試將屬性分配給您的表格。這可能會縮短時間。