【问题标题】:KDB: parallel insertion to tableKDB:并行插入表
【发布时间】:2018-11-26 16:32:41
【问题描述】:

我创建了一个从 Java 到 KDB 的多线程连接,然后将记录同时插入到单个表中。

但似乎单个持续时间和整体持续时间的总和几乎相同,就好像没有发生并发插入一样。

您知道 KDB 是否支持并行插入吗? 如果是这样,我应该做任何设置吗? 它有记录级或表级锁定吗?

【问题讨论】:

    标签: kdb


    【解决方案1】:

    kdb 不支持并行插入到内存表中。事实上,内存数据的更新只能从 q 主线程进行。这意味着如果 q 服务器以负端口启动,则表基本上对所有客户端都“锁定”(无法修改),如果 q 会话处于单线程模式(因为大多数会话往往是)。对于存储在磁盘上的表,情况稍有不同(如果需要,我可以稍后扩展)。

    为了加快您的插入,我建议您查看以下内容:

    a) 插入是成批的,而不是一系列的单个插入?插入 1k 行所需的时间要比插入 1k 行所需的时间少得多。

    b) 插入是异步发送的还是同步发送的?在这两者之间进行更改可能会加快插入速度,但代价是知道插入是否正确执行。

    您能分享更多关于您的用例的信息吗?您的 Java 客户端是否发送市场数据?如果是这样,TP 风格的设置会更合适吗?查看 kdb+ tick 及其衍生产品,例如 TorQ(请注意 TorQ 是由我的雇主开发的)。

    【讨论】:

      【解决方案2】:

      KDB 进程一般是单线程进程(运行在多从线程/进程模式下除外)https://code.kx.com/q/ref/cmdline/#-s-slaves

      虽然您有多个 java 线程将数据写入 q 进程,但数据是以顺序方式写入 KDB 的,因此它不会带来任何性能优势。由于这个原因,它不需要表/行级锁定

      虽然我建议您以异步模式(负句柄)流式传输数据,但这会让您的 java 线程快速到来,而不是等待 KDB 完成操作,这肯定会提高写入端的性能。

      在使用并行处理模式(从线程-正数)时,从线程不允许写入全局表/变量;您需要使用多进程模式来实现(启动 q 进程时为负数)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多