1

我当前的 32 位 kdb+/tick 设置中有一些内存限制,其中我的rdb消耗最多。

我知道我可以通过在 q 进程初始化时使用带有标签的多个线程来绕过 4 GB 32 位可寻址性限制-s,但我不确定如何将其应用于 rdb,其中唯一的函数生成数据是upd:insert.

是否可以手动从其他线程分配内存?

4

1 回答 1

1

据我所知,您不能只使用线程作为额外的内存来源来存储 RDB 数据。(他们确实有自己的堆,但工作都在掩护下,没有暴露到足以让你劫持它们)。线程设计用于并行处理只读数据的函数/查询。

几个想法:

1)您可以创建一个体系结构,其中您有多个 RDB,每个 RDB 都订阅表的子集:

RDB1 - 订阅 table1

RDB2 - 订阅 table2、table3

RDB3 - 订阅 table4

然后创建一个连接到每个 RDB 的网关进程。网关应该确定您尝试查询哪个表并将查询路由到相关的 RDB。

2)如果单个表(例如报价表)仍然太大而无法存储在单个 4gb 进程中,那么您可能必须考虑按股票代码拆分该表(即 RDB1a 为股票代码 AM 订阅报价表,而 RDB1b 订阅报价新西兰股票代码表)。然后,您的网关必须足够聪明,才能知道正在请求哪些代码并相应地路由查询。

3) 如果实际上不需要在 RDB 中始终保存一整天的数据(即,您只是在一天结束时真正使用 RDB 将数据保存到磁盘),那么您应该考虑使用 alt- RDB 定期保存到磁盘并在任何给定时间在内存中保留少量数据(http://code.kx.com/q/cookbook/wq/

4) 如果您认真考虑始终将所有数据存储在内存中,并且您正在收集完整的交易/报价数据,那么实现这一目标的唯一干净方法是使用生产许可证。

于 2015-02-04T16:06:36.863 回答