【问题标题】:How to create KDB query which groups by time interval and do not bring RDB down?如何创建按时间间隔分组且不关闭 RDB 的 KDB 查询?
【发布时间】:2015-02-28 14:15:54
【问题描述】:

我们从交易所收到报价并将其存储在 KDB Ticker Plant。我们希望分析 RDB 和 HDB 中的卷,对这些数据库的性能影响最小,因为它们也被其他团队使用。

  • 首先,我们如何创建一个函数,将一天分成 10 分钟间隔,并为每个间隔创建一个包含交易量的统计信息?我们需要使用哪些 KDB 函数?
  • 其次,怎么安全呢?我们应该在循环中逐部分提取记录还是一次查询一次?我们的数据库中每天有大约 1.5 亿条记录。

【问题讨论】:

    标签: kdb q-lang


    【解决方案1】:

    我将对表名和列名做一些假设,我相信你可以推断出来

    我们从交易所收到报价并将其存储在 KDB Ticker Plant 中

    根据定义,tickerplant 仅将数据存储很短的时间,然后将其记录到文件中并将数据发送到 RDB(和其他侦听器)。

    对这些数据库的性能影响最小

    这完全取决于 (a) 您的数据量 (b) 最佳 where 子句。这还取决于您的机器上是否有足够的 RAM 来处理查询。越接近关键,操作系统分配内存就越困难,因此进行查询所需的时间就越长(尽管与从磁盘上获取数据相比,内存分配时间相形见绌 - 所以磁盘速度也是因素)。

    首先,我们如何创建一个函数,将一天分成 10 分钟间隔,并为每个间隔创建一个包含数量的统计信息?

    你的朋友是 xbar:http://code.kx.com/q/ref/arith-integer/#xbar

    getBy10MinsRDB:{[instrument;mkt]
        select max volume, min volume, sum volume, avg volume by 10 xbar `minute$time from table where sym=instrument, market=mkt
    };
    

    对于 HDB,最佳查询(对于按日期划分的数据库)是 date,然后是 sym,然后是 time。在你的情况下,你没有要求时间,所以我省略了。

    getBy10MinsHDB:{[dt;instrument;mkt]
        select max volume, min volume, sum volume, avg volume by 10 xbar `minute$time from table where date=dt,sym=instrument, market=mkt
    };
    

    我们应该在循环中逐部分提取记录还是一次查询一次?

    不,这绝对是 KDB 中最糟糕的处理方式 :-) 几乎总是有一个很好的矢量化解决方案。

    我们的数据库中每天有大约 1.5 亿条记录。

    由于 KDB 是一个列式数据库,因此您拥有的列的类型与记录的数量一样重要;因为这会影响记忆。

    因为它们也被其他团队使用

    如果像上面这样的简单查询导致问题,您可能需要考虑按市场拆分表,以减少查询冲突和负载。如果内存不是问题,请考虑-s 用于 HDB 的多线程查询(多天)。考虑 HDB 上的负端口号用于多线程输入队列,以最大程度地减少查询冲突(尽管它不一定会使事情变得更快)。

    【讨论】:

    • 谢谢,请您告诉我什么是矢量化解决方案来获取大量数据?
    • 任何选择查询都是“矢量化”的,因为它的拉取和聚合是动态的。如果您从客户端应用程序(Java、C++ 等)执行此操作,并且您一直在 kdb 中达到内存限制,那么您别无选择,只能每天进行查询,或者您可以将数据分割成可管理的块。
    猜你喜欢
    • 2015-02-17
    • 1970-01-01
    • 2020-08-09
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 2019-06-28
    相关资源
    最近更新 更多