【问题标题】:is kdb fast solely due to processing in memorykdb 之所以快,仅仅是因为在内存中处理
【发布时间】:2013-11-13 09:57:49
【问题描述】:

我听过很多次人们谈论 KDB 几乎可以立即处理数百万行。为什么这么快?这仅仅是因为数据都是在内存中组织的吗?

另一件事是有没有替代品呢?任何大型数据库供应商都提供内存数据库?

【问题讨论】:

    标签: kdb


    【解决方案1】:

    快速谷歌搜索找到了答案:

    使用面向列的方法可以提高许多操作的效率。特别是,需要从特定列访问一系列值的操作要快得多。如果列中的所有值都具有相同的大小(按照设计,在 kdb 中这是真的),事情会变得更好。这种类型的访问模式是使用 q 和 kdb 的应用程序的典型。

    为了具体说明,让我们检查一列 64 位浮点数:

    q).Q.w[] `used
    108464j
    q)t: ([] f: 1000000 ? 1.0)
    q).Q.w[] `used
    8497328j
    q)
    

    如您所见,保存一百万个 8 字节值所需的内存仅略高于 8MB。这是因为数据按顺序存储在数组中。为了澄清,让我们创建另一个表:

    q)u: update g: 1000000 ? 5.0 from t
    q).Q.w[] `used
    16885952j
    q)
    

    t 和 u 都共享列 f。如果 q 按行组织其数据,则内存使用量将再增加 8MB。确认这一点的另一种方法是查看 k.h。

    现在让我们看看当我们将表写入磁盘时会发生什么:

    q)`:t/ set t
    `:t/
    q)\ls -l t
    "total 15632"
    "-rw-r--r-- 1 kdbfaq staff 8000016 May 29 19:57 f"
    q)
    

    16 字节的开销。显然,所有数字都按顺序存储在磁盘上。效率是关于避免不必要的工作,在这里我们看到 q 正是在读取和写入列时需要做的事情 - 不多也不少。

    好的,所以这种方法节省空间。这种数据布局如何转化为速度?

    如果我们要求 q 对所有 100 万个数字求和,将整个列表紧密地打包在内存中比面向行的组织具有巨大的优势,因为我们在内存层次结构的每个阶段都会遇到更少的未命中。避免缓存未命中和页面错误对于提高机器性能至关重要。

    此外,在内存中对一长串数字进行数学运算是现代 CPU 指令集具有特殊功能需要处理的问题,包括在不久的将来需要预取数组元素的指令。尽管这些功能最初是为了提高 PC 多媒体性能而创建的,但事实证明它们也非常适合统计数据。此外,局部性和 CPU 特性的相同协同作用使面向列的系统能够比索引搜索(伴随着分支预测失败)更快地执行线性搜索(例如,在未索引列上的 where 子句中),达到惊人的行数。

    来源:http://www.kdbfaq.com/kdb-faq/tag/why-kdb-fast

    【讨论】:

    • 有一篇类似的文章here
    【解决方案2】:

    至于速度,内存确实起到了很大的作用,但还有其他一些事情,从磁盘快速读取 hdb、展开等。根据我的个人经验,我可以说,只要你愿意,你可以从 c++ 获得相当不错的速度写那么多代码。使用 kdb,您可以获得所有这些以及更多。

    关于速度的另一件事也是编码速度。陡峭的学习曲线,但一旦掌握,复杂的问题可以在几分钟内完成。 您可以在内存数据库中查看 onetick 或 google 的替代方法

    【讨论】:

    • SQLite,没听过有人说SQLite快。
    • 从未尝试过,所以不能说,但是是的,也从未听说过有人吹嘘它的速度:)
    【解决方案3】:

    kdb 速度很快,但非常昂贵。另外,学习 Q 很痛苦。有一些替代品,例如 DolphinDB、Quasardb 等。

    【讨论】:

    • 回答与原始问题无关的问题
    猜你喜欢
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 2010-11-27
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 2011-04-25
    相关资源
    最近更新 更多