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
我的问题是:
- 有没有更优雅的方案在服务端序列化调用函数?
- 在服务器上编辑 q.q 以添加
.AAA set get :/q/AAAfuncs
的巧妙方法
- 我的想法是否正确?我认识到这在产品环境中可能很危险
在我看来(和经验),所有 q 函数都应该在脚本中,(生产)kdb 实例可以使用 \l /path/to/script.q
或 system"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
编辑:“每次启动时加载”的一些常用方法包括:
- 从启动命令行加载脚本,又名
q myscript.q -p 1234 -w 10000
你可以有一个加载下标的主脚本。
- 加载数据库或脚本目录包含来自启动命令行的脚本,又名
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
- 就像你说的,你可以在你的QHOME里有一个q.q脚本
我看到很多关于在 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
我的问题是:
- 有没有更优雅的方案在服务端序列化调用函数?
- 在服务器上编辑 q.q 以添加
.AAA set get :/q/AAAfuncs
的巧妙方法
- 我的想法是否正确?我认识到这在产品环境中可能很危险
在我看来(和经验),所有 q 函数都应该在脚本中,(生产)kdb 实例可以使用 \l /path/to/script.q
或 system"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
编辑:“每次启动时加载”的一些常用方法包括:
- 从启动命令行加载脚本,又名
q myscript.q -p 1234 -w 10000
你可以有一个加载下标的主脚本。
- 加载数据库或脚本目录包含来自启动命令行的脚本,又名
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
- 就像你说的,你可以在你的QHOME里有一个q.q脚本