有人使用kdb的矩阵函数吗?与其他工具相比,我发现它很慢。
对于1000乘1000个浮点矩阵上的逆矩阵函数inv,执行10次时kdb+为166,682毫秒。对于矩阵乘法,它花费了3,380毫秒,其中两个矩阵与1000乘1000的维数相同。
我还在DolphinDB上做了同样的实验,这是一个具有内置分析特性(DolphinDB )的类似的时间序列数据库。DolphinDB的inv函数大约快17倍,矩阵乘法大约快6倍。
我认为矩阵运算优化应该是一个很好的方法。是否有任何kdb专家解释其背后的原因,或者是否有任何改进的方法?
我使用了KDB+ 4.0 64位版本和DolphinDB_Linux_V2.00.7(DolphinDB社区版本:2核和8GB内存)。这两个实验都是用两个CPU核进行的。
KDB实现
// Start the server
rlwrap -r taskset -c 0,1 ./l64/q -p 5002 -s 2
// The code
ma:1000 cut (-5.0+ 1000000?10.0)
mb:1000 cut (-5.0+ 1000000?10.0)
\t do[10;inv ma]
16682
\t do[10;ma mmu mb]
3380DolphinDB实现
// Start the server
rlwrap -r ./dolphindb -localSite localhost:5002:local5002 -localExecutors 1
// The code
ma=(-5.0+ rand(10.0,1000000))$1000:1000;
mb=(-5.0+ rand(10.0,1000000))$1000:1000;
timer(10) ma.inv();
Time elapsed: 975.349 ms
timer(10) ma**mb;
Time elapsed: 581.618 ms发布于 2022-09-30 13:58:38
DolphinDB将openblas用于矩阵操作,如inv,而kdb+则不使用。
发布于 2022-09-30 13:36:06
除了知道kdb中的inv使用LU分解(以前它也使用Cholesky分解)之外,这里没有人知道kdb和dolphin在这些操作的掩护下正在做什么。
通常,kdb不是对矩阵操作进行优化,而是对向量操作进行优化。例子--如果您有足够多的工作线程并使用peach
q)\t do[10;ma mmu mb]
2182
q)\t do[10;mmu[;mb]peach ma]
375如果您想在kdb中执行严肃的矩阵操作,您将加载C库来执行繁重的工作。例如,使用Q数学库(http://althenia.net/qml):
q)\t inv ma
1588
q)\t .qml.minv ma
689https://stackoverflow.com/questions/73889464
复制相似问题