【问题标题】:kdb - persisting functions on kdb server & Context managementkdb - kdb 服务器和上下文管理上的持久化功能
【发布时间】:2021-04-01 16:46:39
【问题描述】:

我看到了很多关于在 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. 我的想法正确吗?我知道这在 prod 环境中可能很危险

参考资料KDB Workspace Organization

【问题讨论】:

    标签: kdb


    【解决方案1】:

    在我看来(和经验)所有 q 函数都应该在脚本中,(生产)kdb 实例可以使用\l /path/to/script.qsystem"l /path/to/script.q" 从本地磁盘或某个共享挂载直接加载。理想情况下,所有脚本/函数都应在该实例启动时加载。函数永远不必在生产实例中动态定义,或通过 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 和这里:https://code.kx.com/q4m3/14_Introduction_to_Kdb%2B/#14636-scripts

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

    【讨论】:

    • 再次感谢特里,这很有帮助,我感谢您的实施经验。我们是我们的管理员,所以幸运的是我们拥有完全的控制权。我们的服务器目前是开发服务器,因为我们正在快速开发和更新处理新数据的功能,我正在本地测试它们并推送到我们的开发服务器。在某个时候,我们将冻结成为我们的 Prod 环境。
    • 另外,感谢分享文件夹文件夹加载方法,我忘了那个。我一直在使用下标方法的列表脚本,但文件夹的想法。同样,我们很幸运有空白可以使用,因为我们是 KDB 实例的管理员......至少现在是这样。
    • 知道了。那么是的,您应该使用上述方法之一在实例启动时加载函数脚本。对于开发/测试,您当然可以动态(重新)加载脚本和/或使用 IDE/编辑器动态重新定义功能。但最终目标应该是让函数稳定到加载一次的脚本中。
    • 我不完全理解你问题的第一部分,但如果你想将AAA.q 加载到.AAA 命名空间中,在 q 文件的开头你可以有\d .AAA。在此之后定义的所有函数都是.AAA.func,例如f:{x+y} 将是 .AAA.f
    • 同意这里的 Matt - 函数可以使用\d 上下文切换在脚本中分离到命名空间中。我强烈建议您不要使用序列化函数空间并将其加载回它的方法 - 这使您对函数的可见性为零,因为它在卸载状态下不会是人类可读的,它使您无法管理和跟踪代码更改(例如通过 git),它使您无法搜索代码(例如,如果您想搜索使用特定表的所有函数)。使用脚本可以解决所有这些问题
    猜你喜欢
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多