5

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

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

4

3 回答 3

4

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

于 2013-06-04T14:28:41.207 回答
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/"
于 2013-07-25T21:28:28.010 回答
1

在一天结束时(即您不希望附加数据),您可以从您的 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 章节示例)

于 2013-06-08T08:17:44.743 回答