利用DuckDB luajit插件和openblas库对表中数据做矩阵运算

  1. 安装openblas库

    C:\d>wsl
    root@DESKTOP-59T6U68:/mnt/c/d# docker start gcc
    gcc
    root@DESKTOP-59T6U68:/mnt/c/d# docker exec -it gcc bash
    root@6ae32a5ffcde:/# cd /par
    root@6ae32a5ffcde:/par# whereis libopenblas.so
    libopenblas.so:
    root@6ae32a5ffcde:/par# apt install libopenblas0
    Reading package lists... Done
    Building dependency tree... Done
    Reading state information... Done
    The following additional packages will be installed:
    libgfortran5 libopenblas0-pthread
    The following NEW packages will be installed:
    libgfortran5 libopenblas0 libopenblas0-pthread
    0 upgraded, 3 newly installed, 0 to remove and 117 not upgraded.
    Need to get 7534 kB of archives.
    After this operation, 47.4 MB of additional disk space will be used.
    N: Ignoring file 'debian.sources_org' in directory '/etc/apt/sources.list.d/' as it has an invalid filename extension
    Do you want to continue? [Y/n]
    Get:1 https://mirrors.tuna.tsinghua.edu.cn/debian bookworm/main amd64 libgfortran5 amd64 12.2.0-14+deb12u1 [793 kB]
    Get:2 https://mirrors.tuna.tsinghua.edu.cn/debian bookworm/main amd64 libopenblas0-pthread amd64 0.3.21+ds-4 [6709 kB]
    Get:3 https://mirrors.tuna.tsinghua.edu.cn/debian bookworm/main amd64 libopenblas0 amd64 0.3.21+ds-4 [32.6 kB]
    Fetched 7534 kB in 0s (15.4 MB/s)
    debconf: delaying package configuration, since apt-utils is not installed
    Selecting previously unselected package libgfortran5:amd64.
    (Reading database ... 65497 files and directories currently installed.)
    Preparing to unpack .../libgfortran5_12.2.0-14+deb12u1_amd64.deb ...
    Unpacking libgfortran5:amd64 (12.2.0-14+deb12u1) ...
    Selecting previously unselected package libopenblas0-pthread:amd64.
    Preparing to unpack .../libopenblas0-pthread_0.3.21+ds-4_amd64.deb ...
    Unpacking libopenblas0-pthread:amd64 (0.3.21+ds-4) ...
    Selecting previously unselected package libopenblas0:amd64.
    Preparing to unpack .../libopenblas0_0.3.21+ds-4_amd64.deb ...
    Unpacking libopenblas0:amd64 (0.3.21+ds-4) ...
    Setting up libgfortran5:amd64 (12.2.0-14+deb12u1) ...
    Setting up libopenblas0-pthread:amd64 (0.3.21+ds-4) ...
    update-alternatives: using /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 to provide /usr/lib/x86_64-linux-gnu/libblas.so.3 (libblas.so.3-x86_64-linux-gnu) in auto mode
    update-alternatives: using /usr/lib/x86_64-linux-gnu/openblas-pthread/liblapack.so.3 to provide /usr/lib/x86_64-linux-gnu/liblapack.so.3 (liblapack.so.3-x86_64-linux-gnu) in auto mode
    update-alternatives: using /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblas.so.0 to provide /usr/lib/x86_64-linux-gnu/libopenblas.so.0 (libopenblas.so.0-x86_64-linux-gnu) in auto mode
    Setting up libopenblas0:amd64 (0.3.21+ds-4) ...
    Processing triggers for libc-bin (2.36-9+deb12u13) ...

2.安装duckdb luajit插件linalg库,如果网络不畅安装失败,可以再试

复制代码
root@6ae32a5ffcde:/par# ./duckdb155
DuckDB v1.5.5 (Variegata)
Enter ".help" for usage hints.
memory D load luajit;
memory D SELECT * FROM luajit_module(mode := 'install', sql_name := 'linalg');
┌─────────┬─────────┬─────────┬───────────────────────────────────────────────────────────────────┬─────────┬──────────┐
│   ok    │  mode   │  phase  │                              message                              │ detail  │ sql_name │
│ boolean │ varchar │ varchar │                              varchar                              │ varchar │ varchar  │
├─────────┼─────────┼─────────┼───────────────────────────────────────────────────────────────────┼─────────┼──────────┤
│ false   │ install │         │ install 'linalg' failed: IO Error: Timeout was reached error for  │         │ linalg   │
│         │         │         │ HTTP HEAD to 'https://raw.githubusercontent.com/alitrack/duckdb-l │         │          │
│         │         │         │ uajit-libs/main/INDEX'                                            │         │          │
└─────────┴─────────┴─────────┴───────────────────────────────────────────────────────────────────┴─────────┴──────────┘
memory D SELECT * FROM luajit_module(mode := 'install', sql_name := 'linalg');
┌─────────┬─────────┬─────────┬──────────────────────────────────────┬──────────────────────────────────────┬──────────┐
│   ok    │  mode   │  phase  │               message                │                detail                │ sql_name │
│ boolean │ varchar │ varchar │               varchar                │               varchar                │ varchar  │
├─────────┼─────────┼─────────┼──────────────────────────────────────┼──────────────────────────────────────┼──────────┤
│ true    │ install │ install │ installed 'linalg' (UDF) --- cached at │ luajit_table('linalg') or luajit_s(' │ linalg   │
│         │         │         │  /root/.duckdb/luajit-libs/linalg.lu │ linalg', ...)                        │          │
│         │         │         │ a                                    │                                      │          │
└─────────┴─────────┴─────────┴──────────────────────────────────────┴──────────────────────────────────────┴──────────┘

3.计算常量和表中数据的运算结果

复制代码
memory D SELECT luajit_s('linalg', {'op':'matmul', 'a':[1,2,3,4], 'm':2, 'n':2,'b':[5,6,7,8], 'mb':2, 'nb':2});
┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ luajit_s('linalg', main.struct_pack(op := 'matmul', a := main.list_value(1, 2, 3, 4), m := 2, n := 2, b := main.list │
│                                        _value(5, 6, 7, 8), mb := 2, nb := 2))                                        │
│                                                       varchar                                                        │
├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ {"c":[19,22,43,50]}                                                                                                  │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
memory D create table d (a float[],b float[]);
memory D insert into d select range(1,101)::float[],range(2,202,2)::float[];
memory D SELECT luajit_s('linalg', {'op':'matmul', 'a':a, 'm':2, 'n':50,'b':b, 'mb':50, 'nb':2})from d where length(a)=100;
┌──────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ luajit_s('linalg', main.struct_pack(op := 'matmul', a := a, m := 2, n := 50, b := b, mb := 50, nb := 2)) │
│                                                 varchar                                                  │
├──────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ {"c":[169150,171700,419150,426700]}                                                                      │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────┘

如果把内存数据库改成文件数据库,下次打开数据库时,已安装的luajia库会自动加载。

相关推荐
小徐不徐说4 小时前
C++ 接口与插件设计:从工厂注册到 Qt 动态插件
数据库·c++·qt·系统架构·程序设计
论文复现现场5 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
Decay__5 小时前
04_MySQL DBA 日常运维手册 —— 会话管理、锁与阻塞、事务监控、慢查询与日志巡检
运维·数据库·sql·mysql·架构
心梦缘-雪雁7 小时前
SQL Server 查询数据存在哪个表里
数据库
lusklusklusk8 小时前
Python 巡检脚本:进程运行状态、数据库写入时效检查及邮件通知与告警
数据库·python·oracle
GeW8 小时前
产业新优势基础软件的人才底盘,从Linux与数据库开始
linux·数据库
SelectDB8 小时前
Doris Arrow Flight SQL 高速读取协议实战:与 Snowflake 客户端取数链路对照
大数据·数据库·数据分析
曼岛_8 小时前
[图解密码学]第4章 古典密码
java·数据库·密码学
瀚高PG实验室9 小时前
HGDB V9.0.5 .pgpass 免密登录提示 IsEncryptNon-base64 encoding 警告处理
数据库·postgresql·瀚高数据库
龙腾AI白云9 小时前
大模型检索增强生成(RAG)的技术原理与架构设计
数据库·python·机器学习·知识图谱