如何在kdb中实时正确地划分表?
我有一个C应用程序,它整天将数据流传输到kdb内存表,最终超过了我的服务器RAM的大小。最终的目标是将数据存储在磁盘上,因此我决定运行一个计时器分区函数来逐步传输数据。我想出了这个密码:如何在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 }
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/"