【问题标题】:Can I load from 2 different hdb roots in one KDB service?我可以在一个 KDB 服务中从 2 个不同的 hdb 根加载吗?
【发布时间】:2020-04-21 18:15:41
【问题描述】:

假设我的 hdb 目录中有两个不同的子文件夹,文件夹 A 和文件夹 B。两者都包含按日期分区的数据和针对每个单独表枚举的 sym 文件。目录 A 有 1 个子表,`quote 和目录 B 有另一个表 `trade。我可以使用以下方法将这两个目录分别加载到我的 q 会话中:

system "l /dir/A"
system "l /dir/B"

当我尝试单击目录“A”中的表时,我在 QStudio 中遇到以下错误:

kx.c$KException: ./2020.04.21/quote. OS reports: No such file or directory

现在,如果我再次执行以下操作:

system "l /dir/A" 

错误消失了,但是当我现在尝试点击交易表时,我遇到了同样的错误。有谁知道是否可以从两个单独的目录加载到一个服务中?

【问题讨论】:

    标签: kdb


    【解决方案1】:

    这里的问题是第二个 hdb load system "l /dir/B" 覆盖了第一个。当您加载 hdb 时,kdb 将其映射到内存并使用 sym 文件以原始人类可读形式显示枚举的符号列。它只能使用 1 个 sym 文件来执行此操作,因为枚举列实际上是它们在 sym 文件中位置的索引,引用超过 1 个是没有意义的。

    我认为您应该将它们视为一个日期分区的 hdb,但如果这不是一个选项,您可以设置 2 个 hdb 进程以及可以连接到的端口:

    // start hdbA with quotes
    q /dir/A -p 12345
    
    // start hdbB with trades
    q /dir/B -p 23456
    
    // connect to hdbB from hdbA
    hdbB:hopen `::23456;
    // example query 
    hdbB"select from trades where date = .z.d"
    
    // connect to hdbA from hdbB
    hdbA:hopen `::12345;
    // example query
    hdbA"select from quotes where date = .z.d"
    

    【讨论】:

    • 感谢马特的回答 - 我认为它也是被覆盖的 sym 文件,所以我使用此处“使用多个 sym 文件”下的指南确保每个表都有一个不同的 sym 文件:@ 987654321@ 因此,到目前为止,为了扩展我的问题,文件夹 A 中的 sym 文件称为 symA,文件夹 B 的 sym 文件是 symB。感谢您关于运行第二个进程的建议,这是我目前试图避免的,但会作为最后的手段进行探索!
    • 我相信多 sym 文件的文章是为了在一个 hdb 中有多个 sym 文件。映射 hdb 仍然会有问题,因为您可能在 2 个 hdb 中有相同的日期,这会导致混淆存储在哪里。如果这是空间问题并且 2 个 hdb 在不同的驱动器上,par.txt 可能是您的答案。 code.kx.com/q/kb/partition 你可以在 hdbA 中有 1/2 的日期,在 hdbB 中有另外 1/2 的日期。
    【解决方案2】:

    如果您有两个不同名称的 sym 文件,那么您很幸运 - 您可以使用符号链接简单地创建一个合成数据库,其中链接指向两个表,然后您可以加载合成数据库。当然,维护合成数据库是另一个问题,但这并不太具有挑战性。它看起来像这样:

    synthdb/
        2020.01.01/
            trade -> /db1/2020.01.01/trade
            quote -> /db2/2020.01.01/quote
        2020.01.02/
            trade -> /db1/2020.01.02/trade
            quote -> /db2/2020.01.02/quote
        splay1 -> /db1/splay1
        splay2 -> /db2/splay2
        flat1 -> /db1/flat1
        flat2 -> /db2/flat2
        sym -> /db1/sym
        sym2 -> /db2/sym2
    
    

    【讨论】:

      【解决方案3】:

      可以不用符号链接。 Andrey Kozyrev 编写了在加载的 HDB 和 sym 文件之间移动的代码。你可以在他的https://github.com/quintanar401/DCoQ下找到它

      .db.db:.db.dbm:(0#`)!(); .db.cdb:`;
      .db.sdb:{if[not null .db.cdb;.Q[`sym`date]:(sym;date);.db.db[.db.cdb]:.Q;![`.;();0b;key .Q.dbt]]};
      .db.ldb:{if[x in key .db.db;.db.cdb:x;.Q:.db.db x;`sym`date set' .Q`sym`date;system"cd ",.Q.dbp;set'[key .Q.dbt;value .Q.dbt]]};
      .q.dbl:{.db.sdb[];system "l ",x;.db.cdb:last` vs`$":",x;.Q.dbp:x;.db.dbm[(` sv/: .db.cdb,/:t),t where{$[98=type x:get x;-11=type value flip x;0b]}each t:tables[]]:.db.cdb;.Q.dbt:t!get each t;};
      .q.db:{if[null d:.db.dbm x;'x];if[not .db.cdb=d;.db.sdb[];.db.ldb d];last ` vs x};
      

      那么 dbl"/kdb/history/fx" 然后使用 db`trade 作为表的引用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-20
        • 2013-07-10
        相关资源
        最近更新 更多