kdb中的多线程rdb

kdb中的多线程rdb,kdb,q-lang,Kdb,Q Lang,在当前的32位kdb+/tick设置中,我有一些内存限制,其中rdb消耗的内存最多 我知道我可以通过在q进程初始化时使用带有-s标记的多线程绕过4GB 32位可寻址性限制,但我不确定如何将其应用于rdb,其中唯一生成数据的函数是upd:insert 可以手动从其他线程分配内存吗?据我所知,您不能仅使用线程作为存储RDB数据的额外内存源。(它们确实有自己的堆,但工作都在隐蔽处,暴露的程度不足以让你劫持它们)。线程设计用于对只读数据并行化函数/查询 有几点想法: 1) 您可以创建一个体系结构,其中有

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

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


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

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

有几点想法:

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

RDB1-订阅表1

RDB2-订阅表2、表3

RDB3-订阅表4

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

2) 如果单个表(例如quote table)仍然太大,无法存储在单个4gb进程中,那么您可能必须考虑按ticker拆分该表(即RDB1a为ticker a-M订阅quote table,而RDB1b为ticker N-Z订阅quote table)。然后,您的网关必须足够聪明,以了解正在请求哪些股票代码,并相应地路由查询

< P > 3)如果在RDB中始终有一整天的数据是不需要的(也就是说,你只需要使用RDB在一天结束时将数据保存到磁盘),那么你应该考虑使用ALT RDB,它定期保存到磁盘上,并且在任何给定的时间内存在一个较小的数据量()


4) 如果您真的希望在任何时候都将所有数据存储在内存中,并且您正在收集完整的交易/报价数据,那么实现这一点的唯一干净方法就是获得生产许可证

好主意,我也这么想。谢谢你的想法,我也应该在上面提到——对于上面的建议2),你必须小心一天结束时的保存,因为RDB1a和RDB1b可能同时试图保存到同一分区中的同一个表中(假设日期已分区)。你必须以某种方式确保他们不会同时储蓄。一种更安全的方法是禁用这些RDB的日终保存,这样它们就不会互相绊倒,并运行alt RDB(订阅整个表)来逐点进行保存