2017-08-16 13 views
0

あなたに少しの背景を与える。私はこの大規模な複雑な計算を行うプロセスを持っています。それはタイマーで実行されます。何らかの調査の後、私は、遅さを引き起こしているのは実際の計算ではなく、内部のq関数、結合であることを認識しています。kdb +/q最適化ユニオン関数

テーブルAとテーブルBの2つの単純なテーブルを結合しようとしています.Aは約5mの行で、Bは500です。両方のテーブルには2つの列しかありません。最初の列はシンボルです。表Aは、実際には表の複合主キーです。 (また、どのようにコンソールから直接コピーするのですか?)

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

私が参加し、両方の列とupsertingキーイングしようとしたし、その後の異なる、「どこ小さくない大で大きな、小さな」何も動いていないようにみえ:(

すべてのヘルプは理解されるであろう!

答えて

0

あなたが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グローバル変数である場合、bigが結果

big: big upsert small 

ローカルであれば250の、共通鍵(ID列があるのでbigは、500250の要素を有することになる

`big upsert small 

としてアップサートすることが効率的です)大小のテーブルで

0

これは関係ないかもしれませんが、ちょっと考えました。あなたの大きなテーブルに `symという型の列があり、この列が実際にプログラム全体にはあまり表示されない場合、それを文字列やその他の値にキャストしてみませんか?新しいデータが追加されるたびに、kdb +プロセスはsymファイルを再割り当て/書き換えなければならず、これは実際に多くの時間がかかる部分だと思います

上記の場合は、あなたのsymfile上で再ハッシングの数を最小限に抑えるテーブルを再作成することをお勧めします。 。上記の人のように、テーブルに属性を割り当てようとすると、時間が短縮される可能性があります。