【发布时间】:2018-11-26 16:32:41
【问题描述】:
我创建了一个从 Java 到 KDB 的多线程连接,然后将记录同时插入到单个表中。
但似乎单个持续时间和整体持续时间的总和几乎相同,就好像没有发生并发插入一样。
您知道 KDB 是否支持并行插入吗? 如果是这样,我应该做任何设置吗? 它有记录级或表级锁定吗?
【问题讨论】:
标签: kdb
我创建了一个从 Java 到 KDB 的多线程连接,然后将记录同时插入到单个表中。
但似乎单个持续时间和整体持续时间的总和几乎相同,就好像没有发生并发插入一样。
您知道 KDB 是否支持并行插入吗? 如果是这样,我应该做任何设置吗? 它有记录级或表级锁定吗?
【问题讨论】:
标签: kdb
kdb 不支持并行插入到内存表中。事实上,内存数据的更新只能从 q 主线程进行。这意味着如果 q 服务器以负端口启动,则表基本上对所有客户端都“锁定”(无法修改),如果 q 会话处于单线程模式(因为大多数会话往往是)。对于存储在磁盘上的表,情况稍有不同(如果需要,我可以稍后扩展)。
为了加快您的插入,我建议您查看以下内容:
a) 插入是成批的,而不是一系列的单个插入?插入 1k 行所需的时间要比插入 1k 行所需的时间少得多。
b) 插入是异步发送的还是同步发送的?在这两者之间进行更改可能会加快插入速度,但代价是知道插入是否正确执行。
您能分享更多关于您的用例的信息吗?您的 Java 客户端是否发送市场数据?如果是这样,TP 风格的设置会更合适吗?查看 kdb+ tick 及其衍生产品,例如 TorQ(请注意 TorQ 是由我的雇主开发的)。
【讨论】:
KDB 进程一般是单线程进程(运行在多从线程/进程模式下除外)https://code.kx.com/q/ref/cmdline/#-s-slaves
虽然您有多个 java 线程将数据写入 q 进程,但数据是以顺序方式写入 KDB 的,因此它不会带来任何性能优势。由于这个原因,它不需要表/行级锁定
虽然我建议您以异步模式(负句柄)流式传输数据,但这会让您的 java 线程快速到来,而不是等待 KDB 完成操作,这肯定会提高写入端的性能。
在使用并行处理模式(从线程-正数)时,从线程不允许写入全局表/变量;您需要使用多进程模式来实现(启动 q 进程时为负数)
【讨论】: