Выберите таблицу внутри внешнего выбора

#kdb #k

#kdb #k

Вопрос:

Я видел метод использования update (в основном для побочного эффекта добавления нового столбца, я полагаю) таким образом: update someFun each t from t . Хорошая или плохая практика использовать такую технику?

Некоторые эксперименты:

 t1:([]a:1 2);
t2:([]a:1 2;b:30 40);
update s:{(x`a) x`b} each t2 from t1
  

Кажется, мы можем использовать для этого разные таблицы, поэтому я предположил, что у нас будет перерасход памяти в 2 раза.

Но:

 t:([]a:til 1000000;b:-1*til 1000000);
ts:10 s0: update s:{(x`a) x`b} each t from t;
4761 32778560

ts:10 s1: update s:{(x`a) x`b} each ([]a;b) from t;
4124 32778976

ts:10 s2: update s:{x y}'[a;b] from t;
1908 32778512
  

дает почти одинаковый результат для всех случаев для памяти. Интересно, почему потребление памяти одинаковое?

Ответ №1:

Во всех примерах вы «перебираете» строки таблицы, и кажется, что потребление памяти является результатом постепенного наращивания вектора (выделения нескольких блоков памяти), а не за один раз. Используйте векторные операции, когда это возможно

 q)n:5000000;t:([]a:til n;b:-1*til n)
q)
q)// each row
q)ts update s:{(x`a) x`b} each t from t;
1709 214218848
q)v:n#0
q)ts {x}each v
361 214218256
q)
q)// vector op
q)ts update s:sum a b from t;
18 67109760
q)ts til n
5 67109040
  

Ответ №2:

На самом деле это уже 2x используемой памяти. Размер t составляет 16 М, -22!t а используемая память — 32 М.