2017-08-16 3 views
0

Um Ihnen ein wenig Hintergrundwissen zu geben. Ich habe einen Prozess, der diese große komplexe Berechnung durchführt, die eine Weile dauert, bis sie abgeschlossen ist. Es läuft auf einem Timer. Nach einigen Untersuchungen erkenne ich, dass das, was die Langsamkeit verursacht, nicht die eigentliche Berechnung ist, sondern die interne q-Funktion, Union.kdb +/q optimieren Gewerkfunktion

Ich versuche, zwei einfache Tabellen, Tabelle A und Tabelle B zu vereinen. A ist etwa 5m Zeilen und B ist 500. Beide Tabellen haben nur zwei Spalten. Die erste Spalte ist ein Symbol. Tabelle A ist eigentlich ein zusammengesetzter Primärschlüssel einer Tabelle. (Auch, wie tun Sie direkt von der Konsole kopieren?)

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

Ich habe versucht, beide Spalten und upserting Keying, verbinden und dann deutlich, „groß, klein, wo nicht klein in groß“, aber nichts scheint zu funktionieren :(

Jede Hilfe wird geschätzt!

Antwort

0

Wenn Sie die big Tabelle es eingegeben werden muss, um UPSERT wollen und upsert Operator verwendet. zum Beispiel

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) 
werden soll

Wenn big globale Variable ist, ist es effizienter als

`big upsert small 

UPSERT wenn big

big: big upsert small 

Als Ergebnis lokal ist big 500.250 Elemente haben wird, weil es 250 gemeinsame Schlüssel (id Spalte) in großen und kleinen Tabellen

0

Dies ist vielleicht nicht relevant, aber nur ein kurzer Gedanke. Wenn Ihre große Tabelle eine Spalte hat, die den Typ `sym hat, und wenn diese Spalte nicht wirklich in Ihrem Programm auftaucht, warum sollte sie nicht in einen String oder einen anderen Wert umgewandelt werden? Wenn Sie diesen Update-Prozess jeden einzelnen Tag durchführen, dann, wenn die Daten in Ihrem partitionierten hdb gepackt werden, muss kdb + process, wenn die neuen Daten hinzugefügt werden, seine sym-Datei neu zuweisen/umschreiben, und ich glaube, das ist der Teil, der wirklich viel kostet der Zeit, nicht die Union Berechnung selbst.

Wenn oben wahr ist, würde ich vorschlagen, entweder Ihr Schema für die Tabelle neu zu schreiben, die # von rehashing minimiert (nicht sicher, ob dies der richtige Begriff ist!) auf Ihrer Symdatei . oder, wie die oben genannte Person erwähnt, versuchen Sie, Attribut zu Ihrer Tabelle zuzuweisen .. dies kann die Zeit auch reduzieren.