我有一个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同步。
答案 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章节中的凡人)