2017-08-16 2 views
0

Pour vous donner un peu de contexte. J'ai un processus qui fait ce grand calcul complexe qui prend un certain temps à compléter. Il fonctionne sur une minuterie. Après quelques recherches, je me rends compte que ce qui cause la lenteur n'est pas le calcul réel mais la fonction interne q, union. J'essaie d'unir deux tables simples, la table A et la table B. A est d'environ 5m lignes et B est de 500. Les deux tables ont seulement deux colonnes. La première colonne est un symbole. Le tableau A est en fait une clé primaire composée d'une table. (De plus, comment voulez-vous copier directement depuis la console?)kdb +/q optimiser la fonction d'union

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

J'ai essayé deux colonnes et la saisie upserting, joignez-vous et distincte, « grand, petit où pas petit dans le grand », mais rien ne semble fonctionner :(

Toute aide sera appréciée!

Répondre

0

Si vous voulez upsert la table big il doit être calée et l'opérateur upsert doit être utilisé. Par exemple

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) 

Si big est variable globale, il est efficace de upsert comme

`big upsert small 

si big est locale

big: big upsert small 

Comme résultat big aura 500250 éléments, car il y a 250 clés communes (colonne id) dans les grandes et petites tables

0

cela peut ne pas être pertinent, mais juste une réflexion rapide. Si votre grande table a une colonne qui a le type `sym et si cette colonne n'apparaît pas vraiment tout au long de votre programme, pourquoi ne pas la convertir en chaîne ou autre valeur? Si vous effectuez ce processus de mise à jour tous les jours alors que les données sont compressées dans votre disque dur partitionné, chaque fois que les nouvelles données sont ajoutées, kdb + processus doit réaffecter/réécrire son fichier sym et je crois que c'est la partie qui prend beaucoup Si ce qui précède est vrai, je suggèrerais soit de réécrire votre schéma pour la table qui minimise le nombre de rehashing (pas sûr si c'est le bon terme si!) sur votre fichier symfile . ou, comme mentionné ci-dessus, essayez d'assigner un attribut à votre table .. cela peut aussi réduire le temps.