#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 М.