Как передать аргумент командной строки в функцию kdb - PullRequest
0 голосов
/ 22 января 2019

Я написал сценарий оболочки для сбора данных по каждому символу алфавита из большой таблицы. В связи с тем, что функция требует большого объема памяти, я хочу разделить символы алфавита так, чтобы каждый символ одновременно вызывался с использованием другого номера порта. Однако я не могу успешно передать желаемый аргумент командной строки в мою функцию. При тестировании одного порта и небольшой таблицы я попробовал следующее ...

На сервере: я установил фиктивную таблицу и определил функцию ...

ts:([]sym:1000?`A`Ab`B`Bc`C`Ca`X`Xz`Y`Yx`Z`Zy;price:1000?100.0;num:til 1000)
collect:{[x;y]select from x where sym like y}

На клиенте: я открываю дескриптор соединения, использую пространство имен .z.X, чтобы вернуть строки необработанных, нефильтрованных аргументов командной строки, проиндексировать их и сохранить как переменную, а затем пытаюсь передать эту переменную на мой сервер побочная функция. Я пытался хранить как символ и символ. Он будет работать без ошибок, но ни один не вернет данные при вызове Я сохраняю этот файл как collector.q ..

/ start connection handles to remote server
h:hopen `::5000
/ index into command line arguments to get partition letter. Store as character and symbol
part:.z.X[6]
symPart:`$part
/ call server side functions
fetched:h (`collect; `ts; "symPart*")
/ close connection handle
hclose h

мой сценарий оболочки выглядит следующим образом ...

#!/bin/sh
port=$1
partition=$2

for x in {A..Z}
do
  echo running partition $x on port $port
  $QHOME/l64/q collector.q -p $port -partition $x > ./stdout$port.log 2>&1 &
  port=$(($port + 1))
done

После запуска сценария оболочки при вызове функции fetched на клиенте возвращается пустая таблица ...

q)fetched
symbol price ID
---------------
q)

1 Ответ

0 голосов
/ 22 января 2019

Я думаю, что первая проблема в том, что вы не получаете правильное значение для детали из командной строки. .z.X возвращает командную строку в виде списка токенов, а .z.x возвращает то же самое, но без команды q и имени файла.

q test.q -p 5000 -partition a

q).z.X
"/opt/kdb/3.5/l32/q"
"test.q"
"-p"
"5000"
"-partition"
,"a"
q).z.X[6]
""

Используйте функцию .Q.opt, чтобы превратить параметры командной строки в гораздо более надежный словарь.

q)params:.Q.opt .z.X
q)params
p        | "5000"
partition| ,"a"
q)`$first params`partition
`a

Вторая проблема заключается в том, что "symPart*" не будет оценивать переменную symPart, поскольку она находится внутри кавычек. Все, что видит kdb + - это строка. Каждый цикл скрипта bash будет отправлять одну и ту же команду (`collect; `ts; "symPart*") через дескриптор, с проверкой сбора для раздела "symPart", который, как я полагаю, не существует.

Чтобы передать его как переменную, вы можете изменить его на symPart,"*", но в этом случае symPart должна быть строкой, а не символом, чтобы вы могли удалить приведение.

Вы можете изменить свой скрипт следующим образом:

/ start connection handles to remote server
h:hopen `::5000
/ convert command line arguments into dictionary and index to get partition letter
part:first .Q.opt[.z.X]`partition;
/ call server side functions
fetched:h (`collect; `ts; symPart,"*")
/ close connection handle
hclose h

Или сделать все это в одном сценарии q, вы можете сделать следующее:

/ start connection handles to remote server
h:hopen `::5000

/ call server side functions
fetched:.Q.a!h each (`collect; `ts),/: enlist each .Q.a,\:"*"
/ close connection handle
hclose h

.Q.a содержит все строчные буквы в строке.

q).Q.a
"abcdefghijklmnopqrstuvwxyz"

Мы можем создать все подстановочные знаки, используя каждую левую \: с , (объединение), чтобы присоединить каждую из них к "*", а затем создать несколько команд для отправки через дескриптор, используя каждое право /: для присоединения неизменная левая сторона для всех различных подстановочных знаков.

q).Q.a,\:"*"
"a*"
"b*"
"c*"
"d*"
..

q)(`collect; `ts),/: enlist each .Q.a,\:"*"
`collect `ts "a*"
`collect `ts "b*"
`collect `ts "c*"
..

Обратите внимание, что выводом fetched будет словарь с ключами в качестве разделов и извлеченным результатом каждого раздела в качестве соответствующего значения.

...