kdb - kdb 服务器和上下文管理上的持久功能

kdb - persisting functions on kdb server & Context management

我看到很多关于在 kdb 上序列化表的信息,但是是否有关于让函数在 kdb 服务器上持久存在的建议最佳实践?目前,我在本地的启动 q.q 中加载了一些 .q 文件,并在服务器重新启动时复制了这些 .q 文件。

当我编辑、添加和更改函数时,我在我的本地开发机器上的许多 .q 文件中都引用相同的上下文。然后我将它们一个一个地推送到服务器,使用类似于下面的代码,现在效果很好,但我将功能推送到服务器,然后手动复制每个 .q 文件,然后手动编辑 q.q 服务器上的文件。

\p YYYY;
h:hopen `:XXX.XXX.XX.XX:YYYY;
funcs: raze read0[`$./funcs/funcsAAA.q"]; 
funcs: raze read0[`$./funcs/funcsBBB.q"]; 
funcs: raze read0[`$./funcs/funcsCCC.q"]; 
h funcs;

我想在服务器上序列化它们(相反地 get 它们在系统重新启动时序列化。我已经涉足本地并且当我将它们放入我的启动时似乎可以工作q.q

`.AAA set get `:/q/AAAfuncs
`.BBB set get `:/q/BBBfuncs
`.CCC set get `:/q/CCCfuncs

我的问题是:

  1. 有没有更优雅的方案在服务端序列化调用函数?
  2. 在服务器上编辑 q.q 以添加 .AAA set get :/q/AAAfuncs
  3. 的巧妙方法
  4. 我的想法是否正确?我认识到这在产品环境中可能很危险

参考文献KDB Workspace Organization

在我看来(和经验),所有 q 函数都应该在脚本中,(生产)kdb 实例可以使用 \l /path/to/script.qsystem"l /path/to/script.q" 直接从本地磁盘或某些磁盘加载共享挂载。理想情况下,所有 scripts/functions 都应该在该实例启动时加载。函数永远不必在生产实例中动态定义,或通过 IPC 定义,或编写序列化并重新加载。

谁运行与您交互的这个 kdb 实例?谁是管理员?您应该联系实例的管理员,让他们设置一种机制,让您的脚本在启动时加载到实例中。

如果您真的不能在服务器端定义函数,另一种方法是在启动时在本地实例中定义函数,然后通过 IPC 发送函数调用,例如

system"l /path/to/myscript.q"; /make this load every time on startup

/to have your function executed on the server without it being defined on the server
h:hopen `:XXX.XXX.XX.XX:YYYY;
res:h(myfunc1;`abc);

这会在您的本地实例中加载函数,但会将函数连同输入参数一起发送到远程服务器进行评估 `abc

编辑:“每次启动时加载”的一些常用方法包括:

  1. 从启动命令行加载脚本,又名
q myscript.q -p 1234 -w 10000

你可以有一个加载下标的主脚本。

  1. 加载数据库或脚本目录包含来自启动命令行的脚本,又名
q /path/to/db -p 1234 -w 10000

Jeff Borror 在这里提到了这一点:https://code.kx.com/q4m3/14_Introduction_to_Kdb%2B/#14623-scripts and here: https://code.kx.com/q4m3/14_Introduction_to_Kdb%2B/#14636-scripts

  1. 就像你说的,你可以在你的QHOME里有一个q.q脚本