如何在kdb中实时正确分区表?

时间:2013-06-04 13:41:53

标签: kdb

我有一个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

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

在上面的评论中你问:

  

如果没有,我怎样才能在一天结束时有效地重组数据库   按顺序存储符号?

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

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

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

其中:

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

对于单个文件表:

    TABLE: `tableName;

对于展开的表格:

    TABLE: `$"tablename/"

答案 2 :(得分:1)

在一天结束时(即您不希望附加数据),您可以通过c程序致电:

写入2013.01.01的位置

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

清除表格

delete from `tableName

清除一些记忆

.Q.gc peach til system"s"

当然,假设您有时间/ sym列,并且您希望按日期显示。否则

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

将展开。

如果您愿意,也可以附加(例如,参见Q章的IO章节中的凡人)