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