kdb中的多线程rdb
Multithreaded rdb in kdb
我当前的 32 位 kdb+/tick 设置有一些内存限制,其中我的 rdb 消耗最多。
我知道我可以通过在 q 进程初始化时使用带有 -s
标记的多个线程来绕过 4 GB 32 位寻址能力限制,但我不确定如何将其应用于 rdb ,其中唯一生成数据的函数是 upd:insert
。
是否可以手动从其他线程分配内存?
据我所知,您不能只使用线程作为额外的内存源来存储 RDB 数据。 (他们确实有自己的堆,但工作都在幕后,没有暴露到足以让你劫持他们)。线程设计用于在只读数据上并行化 functions/queries。
几个想法:
1) 您可以创建一个架构,其中您有多个 RDB,每个 RDB 订阅 tables:
的一个子集
RDB1 - 订阅 table1
RDB2 - 订阅 table2、table3
RDB3 - 订阅 table4
然后创建一个连接到每个 RDB 的网关进程。网关应确定您要查询的 table 并将查询路由到相关的 RDB。
2) 如果单个 table(例如引用 table)仍然太大而无法存储在单个 4gb 进程中,那么您可能不得不考虑拆分 table按代码(即 RDB1a 订阅代码 A-M 的报价 table,而 RDB1b 订阅代码 N-Z 的报价 table)。那么您的网关必须足够聪明,才能知道正在请求哪些代码并相应地路由查询。
3) 如果实际上不需要在 RDB 中始终保存一整天的数据(即您只是在一天结束时真正使用 RDB 将数据保存到磁盘),那么您应该考虑使用 alt-RDB,它会定期保存到磁盘并在任何给定时间在内存中保留更少量的数据 (http://code.kx.com/q/cookbook/w-q/)
4) 如果您真的想始终将所有数据存储在内存中,并且正在收集完整的 trade/quote 数据,那么实现此目的的唯一干净方法是使用生产许可证。
我当前的 32 位 kdb+/tick 设置有一些内存限制,其中我的 rdb 消耗最多。
我知道我可以通过在 q 进程初始化时使用带有 -s
标记的多个线程来绕过 4 GB 32 位寻址能力限制,但我不确定如何将其应用于 rdb ,其中唯一生成数据的函数是 upd:insert
。
是否可以手动从其他线程分配内存?
据我所知,您不能只使用线程作为额外的内存源来存储 RDB 数据。 (他们确实有自己的堆,但工作都在幕后,没有暴露到足以让你劫持他们)。线程设计用于在只读数据上并行化 functions/queries。
几个想法:
1) 您可以创建一个架构,其中您有多个 RDB,每个 RDB 订阅 tables:
的一个子集RDB1 - 订阅 table1
RDB2 - 订阅 table2、table3
RDB3 - 订阅 table4
然后创建一个连接到每个 RDB 的网关进程。网关应确定您要查询的 table 并将查询路由到相关的 RDB。
2) 如果单个 table(例如引用 table)仍然太大而无法存储在单个 4gb 进程中,那么您可能不得不考虑拆分 table按代码(即 RDB1a 订阅代码 A-M 的报价 table,而 RDB1b 订阅代码 N-Z 的报价 table)。那么您的网关必须足够聪明,才能知道正在请求哪些代码并相应地路由查询。
3) 如果实际上不需要在 RDB 中始终保存一整天的数据(即您只是在一天结束时真正使用 RDB 将数据保存到磁盘),那么您应该考虑使用 alt-RDB,它会定期保存到磁盘并在任何给定时间在内存中保留更少量的数据 (http://code.kx.com/q/cookbook/w-q/)
4) 如果您真的想始终将所有数据存储在内存中,并且正在收集完整的 trade/quote 数据,那么实现此目的的唯一干净方法是使用生产许可证。