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

如何在kdb中实时正确地划分表?,kdb,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 }

我有一个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
part_计时器:{[]
(`$db)upsert.Q.en[`$sym_path]从md选择[20000]ts、exch、ticker、side、price、qty、bid、ask;

从'md'中删除,其中i,而不是您的问题的明确解决方案。看看w.q。这是传统RDB的一个仅写替代方案。这会缓冲请求,并且每个MAXROWS记录都会将数据写入磁盘。

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

写入2013.01.01的位置

.Q.dpft[`:/path/to/location;2013.01.01;`sym;`tableName];
收拾桌子

delete from `tableName
清除一些记忆

.Q.gc peach til system"s"
当然,假设您有time/sym列,并且希望按日期显示,否则

`:/path/to/location/tableName/ set tableName
会散开的


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

在您询问的上述评论中:

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

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

运行以下操作对磁盘上的数据进行排序(这比将数据拉入ram、排序然后写入磁盘慢):

其中:

    PATH: `:path/on/disk/to/db/root;
对于单文件表:

    TABLE: `tableName;
对于八字桌:

    TABLE: `$"tablename/"

感谢.Q调用,我将把它们添加到我的脚本中。我迫不及待地要存储数据,我在问题中解释说,内存表将超过我们安装的RAM,因此我希望逐渐存储到磁盘。啊,没有注意到这一点;在这种情况下,像有人说的那样在w.Q中追加。Q.dpft[]追加行?对kdb来说听起来很棘手。如果不是,我如何在一天结束时有效地重新组织数据库以按顺序存储符号?不,它会覆盖。`:/splay/upsert t将追加(+.Q.en以枚举符号)这个答案与原来的问题无关,因为这种情况通常被删除,请考虑将此摘要作为注释添加。
    TABLE: `$"tablename/"