добавление данных без использования глобальных переменных - PullRequest
0 голосов
/ 23 мая 2018

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

res();
{[someVar]
    res,:: select x from y where (constraints related to someVar)
} each list of someVars

Это не совсем функциональный стиль.Есть ли другой способ добиться этого без глобалов?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Пара моментов:

  1. Вам не нужно двойное двоеточие для глобального назначения, когда вы выполняете добавление на месте (он же a,:b, а неa::a,b).Сингл будет работать в этом случае, так как добавление на месте работает в глобальном контексте.

  2. Вы не принимаете во внимание тот факт, что добавление на месте очень эффективно при использовании памяти, даже если оно не "функционально" и использует глобальный контекст.Например:

    q)\ts t:([]col1:10000000?100j)
    110 134218192
    
    q)\ts a:{x,select from y}/[t;2 cut ([]col1:til 6)]
    74 268436720
    
    q)\ts {t,:x} each 2 cut ([]col1:til 6)
    0 1424
    q)a~t
    1b
    

Метод итерации с использованием over (/) и обхода глобальных переменных создает копию таблицы, удваивая использование памяти.Приложение в месте использует очень мало памяти для того же результата.

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

0 голосов
/ 23 мая 2018
res:(),/{[someVar]
    select x from y where (constraints related to someVar)
} each someVars

возьмет список возвращенных таблиц и присоединит их к res с помощью наречий (/)

https://code.kx.com/q/ref/adverbs/#over

...