gpt4 book ai didi

kdb - kdb 速度快仅仅是因为在内存中进行处理吗

转载 作者:行者123 更新时间:2023-12-01 18:58:03 32 4
gpt4 key购买 nike

我曾多次听到人们谈论 KDB 几乎可以在短时间内处理数百万行数据。为什么这么快?这仅仅是因为数据都组织在内存中吗?

另一件事是有替代方案吗?有大型数据库供应商提供内存数据库吗?

最佳答案

快速 Google 搜索得出了答案:

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

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

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 子句中),直至达到惊人的行数。

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

关于kdb - kdb 速度快仅仅是因为在内存中进行处理吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19950657/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com