2016-04-01 19 views
0

Bir üst düzey sözlüğün 3 temel sıralama türüne sahip olduğu bir sipariş defteri veri yapısı oluşturmaya çalışıyorum; bu türlerin her biri bir teklife ve sorma yüzüne sahiptir ve her bir tarafın her bir satır için bir tablo listesi vardır. Örneğin, Google stoğu için tür1'in tüm sipariş isteklerini almak istiyorsam, numaralı kitabı [`orderType1] [` ask] [`GOOG] olarak adlandırırdım. Aşağıdaki kullanarak bu uygulamaya:İç içe geçmiş bir sözlük içindeki bir tablodaki girişler nasıl güncellenir?

bookTemplate: ([]orderID:`int$();date:"d"$();time:`time$();sym:`$();side:`$(); 
orderType:`$();price:`float$();quantity:`int$()); 
bookDict:(1#`)!enlist`orderID xkey bookTemplate; 
book: `orderType1`orderType2`orderType3 ! (3# enlist(`ask`bid!(2# enlist bookDict))); 

kitabı kullanarak veri alma [ `orderType1] [` sormak] [ `senedi] iyi çalışıyor gibi görünüyor. Geçen sorgu yürütme

testorder:`orderID`date`time`sym`side`orderType`price`quantity!(111111111;.z.D;.z.T; 
`GOOG;`ask;`orderType1;100.0f;123); 
book[`orderType1][`ask][`GOOG],:testorder; 

'verir hata atamak: Belirli bir sipariş defteri örneğin yeni düzen eklemeye çalıştığınızda sorun görünür. Sebebi nedir? Nasıl çözeceksin?

cevap

2

Birkaç sorun burada. Eğer sıralı tekrarlanan anahtar bir dizi kullanarak sözlükleri içine arama kullanımın oldukça olmanın İlki, yani

q)book[`orderType1][`ask][`GOOG] 
orderID| date time sym side orderType price quantity 
-------| ------------------------------------------- 

(yalnızca bir düzey derin de atayabilirsiniz) böyle değerleri atamak mümkün değil. Daha iyi yaklaşım nokta indekslemeyi kullanmaktır (ve değerleri yeniden atamak için nokta değiştirme). Ancak, sorun, sözlükler listesinin tekdüze olması nedeniyle, kitap sözlüğünüzün değeri bir tabloya düzleşiyor olmasıdır. Yani bu başarısız:

q)book . `orderType1`ask`GOOG 
'rank 

Bir jenerik null adlı

ekleyerek

q)book 
      | ask 
----------| ----------------------------------------------------------------- 
orderType1| (,`)!,(+(,`orderID)!,`int$())!+`date`time`sym`side`orderType`pric 
orderType2| (,`)!,(+(,`orderID)!,`int$())!+`date`time`sym`side`orderType`pric 
orderType3| (,`)!,(+(,`orderID)!,`int$())!+`date`time`sym`side`orderType`pric 

karışık bir liste olmaya değer zorlayabilir düzleştirme Bunu önlemek için terminali inceleyerek o dümdüz oldu nasıl görebilirsiniz

q)book: ``orderType1`orderType2`orderType3 !(::),(3# enlist(`ask`bid!(2# enlist bookDict))); 

Sonra şuna benzer:

q)book 
      | :: 
orderType1| `ask`bid!+(,`)!,((+(,`orderID)!,`int$())!+`date`time`sym`side`ord 
orderType2| `ask`bid!+(,`)!,((+(,`orderID)!,`int$())!+`date`time`sym`side`ord 
orderType3| `ask`bid!+(,`)!,((+(,`orderID)!,`int$())!+`date`time`sym`side`ord 

Dot-indeksleme şimdi çalışır:

q)book . `orderType1`ask`GOOG 
orderID| date time sym side orderType price quantity 
-------| ------------------------------------------- 

şimdi Nihayet çok

q).[`book;`orderType1`ask`GOOG;,;testorder] 
`book 
q)book 
      | :: 
orderType1| `ask`bid!+``GOOG!(((+(,`orderID)!,`int$())!+`date`time`sym`side`o 
orderType2| `ask`bid!+(,`)!,((+(,`orderID)!,`int$())!+`date`time`sym`side`ord 
orderType3| `ask`bid!+(,`)!,((+(,`orderID)!,`int$())!+`date`time`sym`side`ord 

çalışacak nokta değiştirilmesi anlamına gelir, ben bu FD makalesini okumanızı tavsiye ederim iyi nasıl mağaza kitap verilerine: http://www.firstderivatives.com/downloads/q_for_Gods_Nov_2012.pdf

+0

Çok teşekkürler. Anahtarlı bir tabloda neden (virgül) kullanılmamasının nedenini açıklayabilir misiniz? Öyle görünüyor ki. [\ 'Kitap; \' orderType1 \ 'sor \' GOOG;, testorder] ** iyi çalışıyor (yani sipariş ID'si tabloda yoksa ve mevcut girişi başka bir şekilde güncelliyorsa yeni girişler eklemek gibi). Aynı zamanda çok daha hızlı (100000 sipariş ve ~ 100s siparişleri eklemek için ~ 7s). Bunu da bağlı olduğunuz FD belgesinde yapıyorlar (ör. Alttaki tablonun fiyatla düzenlendiği updBySymSide2). – dhk

+0

Haklısın, kötüyüm. Testlerimde başarısız olduğunu düşündüm. Cevabımı düzenleyeceğim teşekkürler – terrylynch