kdb 中的命名空间行为

问题描述 投票:0回答:1

我在 KDB 项目中有一个文件,其中仅声明了命名空间。例如

.file.namespace1:`someValue;
.file.namespace2.dict: flip `value1`value2`value3!(`I;20;200);
.file.namespace3.dict: flip `value1`value2`value3!(`A;@[getVlueFor;a;{.log.info "Value missing for }x] ;300);

这些字典类型的命名空间变量之一有一些键,其值需要从进程将运行的服务器上的磁盘读取。因此,我在 @[f;y;e] 处使用 trap 作为我们的项目,在编译时出现错误,因为它试图评估它,但该文件不应该位于正在编译项目的盒子上。 (我们的项目是用 mvn 构建的,我是新手)。使用 trap 帮助我在编译过程中摆脱了这个错误。

在我们的代码中,这个命名空间被分配给一个变量,当所有内容都为命名空间进行硬编码时,这会成功工作,但当我尝试通过命名空间字典中的某些键进行延迟初始化时会失败,因为我希望从磁盘读取这些键值。我不确定为什么这会导致错误,当进程启动时,所有这些 q 文件都会被加载,所以我希望它能够成功工作。

我不确定我是否缺少一些基本的东西以及我需要什么来克服这个问题?

kdb q kdb+
1个回答
0
投票

如果在无法访问填充值所需的磁盘文件的服务器上运行

getVlueFor
,则始终会出错。您有 2 个选择:

  1. 像你一样的错误陷阱。
  2. 使用适当的默认值。
q)`:B set 1000
cat test.q
getVlueFor:{get hsym x}

.file.namespace3.dict: flip enlist each `value1`value2`value3!(`A;{@[getVlueFor;x;2000]} `B;300)
.file.namespace4.dict: flip enlist each `value1`value2`value3!(`A;{@[getVlueFor;x;2000]} `C;300)

在此示例中,

value2
.file.namespace3.dict
.file.namespace4.dict
定义为默认值2000,并尝试分别从磁盘读取
`:B
 `:C
。由于
`:B
确实存在,因此它的值设置为 1000:

q test.q

.file.namespace3.dict
value1 value2 value3
--------------------
A      1000   300

由于

`:C
不存在,因此默认为 2000:

value1 value2 value3
--------------------
A      2000   300

您的示例错误陷阱包含多个语法错误,因此为了清楚起见,它应该是这样的:

cat test2.q
getVlueFor:{get hsym x}
.file.namespace5.dict: flip enlist each `value1`value2`value3!(`A;{@[getVlueFor;x;{[x;y] neg[1]"Error: value missing for:",string x;}x]} `D;300)

q test2.q

Error: value missing for:D
© www.soinside.com 2019 - 2024. All rights reserved.