【问题标题】:How to correctly partition a table in real-time in kdb?如何在kdb中实时正确分区表?
【发布时间】:2013-06-04 13:41:52
【问题描述】:

我有一个 C 应用程序,它整天将数据流式传输到 kdb 内存表,最终超出了我的服务器 RAM 的大小。最终目标是将数据存储在磁盘上,所以我决定运行一个计时器分区功能来逐步传输数据。我想出了这段代码:

part_timer : { []
    (`$db) upsert .Q.en[`$sym_path] select [20000] ts,exch,ticker,side,price,qty,bid,ask from md;
    delete from `md where i<20000
}

.z.ts: part_timer
.z.zd: 17 2 6i
\t 1000

这是实时分区流数据的正确方法吗?你会怎么写这段代码?我担心删除语句与选择不同步。

【问题讨论】:

    标签: kdb


    【解决方案1】:

    虽然不是您问题的明确解决方案。看看 w.q here。这是传统 RDB 的只写替代方案。这会缓冲请求,并且每个 MAXROWS 记录都会将数据写入磁盘。

    【讨论】:

      【解决方案2】:

      在上面的评论中你问:

      如果没有,我该如何在一天结束时有效地重组数据库 顺序存储符号?

      我知道这个答案有点延迟,但这可能会帮助其他尝试做同样事情的人。

      运行以下命令对磁盘上的数据进行排序(这比将数据拉入内存、排序然后写入磁盘要慢):

           par:.Q.par[PATH;.z.D;TABLE];
           par xasc `sym;
           @[par;`sym;`p#];
      

      地点:

          PATH: `:path/on/disk/to/db/root;
      

      对于单个文件表:

          TABLE: `tableName;
      

      对于张开的桌子:

          TABLE: `$"tablename/"
      

      【讨论】:

      • 此答案与原始问题无关。由于此类案例通常会被删除,因此请考虑添加对此的摘要作为评论。
      【解决方案3】:

      在一天结束时(即您不希望附加数据),您可以从您的 c 程序中调用:

      写到 2013.01.01 的位置

      .Q.dpft[`:/path/to/location;2013.01.01;`sym;`tableName];
      

      清空表格

      delete from `tableName
      

      清理一些内存

      .Q.gc peach til system"s"
      

      当然,假设您有时间/符号列,并且您希望按日期展开。否则

      `:/path/to/location/tableName/ set tableName
      

      会张开。

      如果你愿意,也可以附加(参见 Q for Mortals 的 IO 章节)

      【讨论】:

      • 感谢 .Q 调用,我会将它们添加到我的脚本中。我等不及要存储数据了,我在问题中解释说内存表会超出我们安装的 RAM,所以我希望逐步存储到磁盘。
      • 啊错过了;在这种情况下,按照某人所说的在 w.q 中追加
      • 是否可以使用 .Q.dpft[] 追加行? kdb 听起来很棘手。如果没有,我如何在一天结束时有效地重组数据库以按顺序存储符号?
      • 不,它会覆盖。 `:/splay/ upsert t 将附加(+ .Q.en 以枚举符号)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      相关资源
      最近更新 更多