PostgreSQL【应用 03】Docker部署的PostgreSQL扩展SQL之C语言函数(编写、编译、载入)计算向量余弦距离实例分享

这篇具有很好参考价值的文章主要介绍了PostgreSQL【应用 03】Docker部署的PostgreSQL扩展SQL之C语言函数(编写、编译、载入)计算向量余弦距离实例分享。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

通过使用 PostgreSQL 的 C 函数接口,我们可以编写用 C 语言实现的函数,并将其集成到数据库中。这些函数可以在 SQL 查询中像其他内置函数一样被调用,从而扩展 PostgreSQL 的功能。

C 函数在某些情况下可以提供比 SQL 函数更高的执行效率,因为它们可以直接访问底层系统资源并进行更高级的优化。通过使用 C 函数,我们可以在函数内部实现复杂的算法和逻辑,利用 C 语言的功能和库来提高执行效率。

环境说明:

# 此版本库可用
[root@tcloud ~]# docker -v
Docker version 20.10.13, build a224086

# 此版本不可用
[root@nodexxx ~]# docker -v
Docker version 1.13.1, build 7d71120/1.13.1

注意:Docker version 1.13.1无法使用。

1.准备

1.1 开发文档

-- 查询数据库版本
SELECT "version"()
-- PostgreSQL 12.12 (Debian 12.12-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit

根据数据库的版本查看文档:

英文:PostgreSQL: Documentation: 12: 37.10. C-Language Functions

中文:37.10. C 语言函数 (postgres.cn)

1.2 工具安装

# 避免报错1 bash: cc: command not found
# 未 update 可能会报错 E: Unable to locate package gcc
apt-get update
apt-get install gcc

# 避免报错2
functionNameFile.c:1:10: fatal error: postgres.h: No such file or directory
    1 | #include "postgres.h"
      |          ^~~~~~~~~~~~
compilation terminated.

# 根据版本进行安装【必备】
apt-get install postgresql-server-dev-12
# 报错
postgresql-server-dev-12 : Depends: llvm-11-dev but it is not installable

2.开始

2.1 编写C语言函数

创建一个新的文件,例如 cosine_distance_c.c,并添加以下内容:

#include "postgres.h"
#include "fmgr.h"
#include "math.h"
#include "utils/array.h"
#include "utils/float.h"

PG_MODULE_MAGIC;

PG_FUNCTION_INFO_V1(cosine_distance_c);

Datum cosine_distance_c(PG_FUNCTION_ARGS)
{
    ArrayType *arr1;
    arr1  = PG_GETARG_ARRAYTYPE_P(0);
    ArrayType *arr2;
    arr2 = PG_GETARG_ARRAYTYPE_P(1);
    int num_elems1, num_elems2;
    int16 elmlen;
    bool elmbyval, elmIsNull;
    Datum *elems1, *elems2;
    float8 sum_xy = 0.00000;
    float8 sum_x2 = 0.00000;
    float8 sum_y2 = 0.00000;
    float8 result;
    int i;
    deconstruct_array(arr1, 701, 8, FLOAT8PASSBYVAL, 'd', &elems1, NULL, &num_elems1);
    deconstruct_array(arr2, 701, 8, FLOAT8PASSBYVAL, 'd', &elems2, NULL, &num_elems2);
    if (num_elems1 != num_elems2)
        ereport(ERROR, (errmsg("Array lengths are not equal")));
    for (i = 0; i < num_elems1; i++)
    {
        sum_xy = sum_xy +  DatumGetFloat8(elems1[i]) * DatumGetFloat8(elems2[i]);
        sum_x2 = sum_x2 +  DatumGetFloat8(elems1[i]) * DatumGetFloat8(elems1[i]);
        sum_y2 = sum_y2 +  DatumGetFloat8(elems2[i]) * DatumGetFloat8(elems2[i]);
    }
    if (sum_x2 == 0.0 || sum_y2 == 0.0)
        ereport(ERROR, (errmsg("One or both arrays have zero magnitude")));
    result = sum_xy / (sqrt(sum_x2) * sqrt(sum_y2));
    pfree(elems1);
    pfree(elems2);
    PG_RETURN_FLOAT8(result);
}

2.2 编译和链接动态载入的函数

Linux环境:

# 创建PIC的编译器标志是-fpic。创建一个共享库的编译器标志是-shared。
cc -fPIC -c funcs.c
cc -shared -o funcs.so funcs.o

实例使用 C 编译器将源代码编译为共享库,例如 cosine_distance_c.so

# 使用
cc -fPIC -I`pg_config --includedir-server` -c cosine_distance_c.c
cc -shared -o cosine_distance_c.so cosine_distance_c.o -I`pg_config --includedir-server` -lm
  1. 将共享库文件复制到 PostgreSQL 的共享库目录中:
cp cosine_distance_c.so `pg_config --libdir`/.

# 实际查询
root@a0e33689b846:/# pg_config --libdir
/usr/lib/x86_64-linux-gnu
  1. 在 PostgreSQL 中创建函数的定义:
-- 这里用到了 pg_config --libdir 查询到的目录
CREATE FUNCTION cosine_distance_c(float8[], float8[])
    RETURNS float8
    AS '//usr/lib/x86_64-linux-gnu/cosine_distance_c.so', 'cosine_distance_c'
    LANGUAGE C STRICT;

现在,你可以在 SQL 查询中使用 cosine_distance_c 函数来计算两个 numeric 数组之间的余弦距离,例如:

SELECT cosine_distance_c(ARRAY[1.0, 2.0, 3.0], ARRAY[4.0, 5.0, 6.0]);

注意:上述示例是一个简化的实现,它假设传入的两个数组参数都是 numeric 类型的一维数组。在实际应用中,你可能需要进行更多的参数校验和错误处理,并支持更复杂的数组类型和维度。文章来源地址https://www.toymoban.com/news/detail-610554.html

到了这里,关于PostgreSQL【应用 03】Docker部署的PostgreSQL扩展SQL之C语言函数(编写、编译、载入)计算向量余弦距离实例分享的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [pgrx开发postgresql数据库扩展]4.基本计算函数的编写与性能对比

    再次声明: 并不是所有场景都需要(或者适合)用rust来写的,绝大部分操作数据库的功能和计算,用SQL就已经足够了! 本系列中,所有的案例,仅用于说明pgrx的能力,而并非是说这样做比用SQL更合适。反之:对于操作数据库本身的部分,大部分能用SQL来实现的东西,都比做

    2024年02月01日
    浏览(83)
  • [pgrx开发postgresql数据库扩展]6.返回序列的函数编写(1)单值序列

    上篇文章是中规中矩的标准计算函数,就算不用pgrx,也是可以正常理解的,所以基本上没有什么对于pgrx框架有关系的东西(唯一有关系的东西,应该就是Rust的时间类型与pgrx的时间类型的计算了)。 这篇文章会讲一个pgrx对于postgresql或者说对于任何数据库扩展来说都比较有用

    2024年02月03日
    浏览(40)
  • 【sql高级】postgresql之窗口函数用法

    窗口函数在在SQL中是非常有用的工具,特别是在需要对查询结果进行分析、排名、聚合或者对结果进行一些特定的计算时。以下是一些常见的场景: 排名和分组:窗口函数可以轻松地对结果集进行排名、分组和分区。例如,你可以使用 ROW_NUMBER()、RANK()、DENSE_RANK() 等函数来为

    2024年03月23日
    浏览(44)
  • Docker安装部署Postgresql

    Centos7.x + docker1.13.1 + postgres12 本文使用的是在镜像仓库直接pull的方式,非Dockfile的方式。 Postgresql的Dockerfile参考:https://github.com/docker-library/postgres/blob/master/12/alpine/Dockerfile docker命令大全:https://www.runoob.com/docker/docker-command-manual.html 请注意区分“镜像”和“容器”的。先创建镜

    2024年02月05日
    浏览(30)
  • Dify开源大语言模型(LLM) 应用开发平台如何使用Docker部署与远程访问

    本文主要介绍如何在Linux Ubuntu系统以Docker的方式快速部署Dify,并结合cpolar内网穿透工具实现公网远程访问本地Dify! Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务(Backend as Service)和 LLMOps 的理念,使开发者可以快速搭建生产级的生成式 AI 应用。即使你

    2024年04月10日
    浏览(45)
  • 【Kotlin】DSL 领域特定语言 ( apply 标准库函数分析 | 普通匿名函数 | 扩展匿名函数 | 泛型扩展匿名函数 )

    本章总结 : 读懂 apply 标准库函数 核心是其 block: T.() - Unit 参数 , 这是 泛型扩展匿名函数 ; 泛型扩展匿名函数 T.() - Unit 演变路径 : 普通匿名函数 : () - Unit , 这个函数 参数 和 返回值 都为空 ; 扩展匿名函数 : String.() - Unit , 这个函数 是 为 具体的 String 类型定义的扩展函数 ; 泛型

    2023年04月09日
    浏览(37)
  • 使用docker部署postgreSQL数据库

    随着docker的广泛应用,为了提供便利的管理,PostgreSQL数据库也支持docker的安装方式。下面详细介绍docker安装PostgreSQL数据库的方法。 1、查看下载数据库镜像命令 访问dockerhub官网:https://registry.hub.docker.com/ 地址,下载指定版本的postgresql数据库。 2、执行下载命令 在安装有doc

    2024年02月11日
    浏览(52)
  • 群晖DS218+部署PostgreSQL(docker)

    这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 最近在开发中要用到PostgreSQL数据库,不想装在MacBook上(也不想装docker),于是安装在另一台电脑上,用的时候打开电脑运行数据库,用完再关闭电脑,总觉得这些操作挺麻烦(您想骂我懒么?您骂

    2024年02月13日
    浏览(37)
  • 【微服务部署】一、使用docker-compose部署Jenkins、SonarQube、PostgreSQL

    一、安装 1、编写docker-compose部署Postgres、SonarQube、Jenkins的yml文件jenkins-compose.yml Postgres:作为SonarQube的数据库存储 SonarQube:代码质量检查 Jenkins:jenkins/jenkins:lts镜像,jenkinsci/blueocean镜像缺少node运行时环境,导致node无法运行。 关键配置说明( 宿主机 : Docker容器): /data/doc

    2024年02月09日
    浏览(36)
  • docker-compose 部署nacos 整合 postgresql 为DB

    前提: 已经安装好postgresql数据库 先创建好一个数据库 nacos,执行以下sql: 服务器目录结构: pgsql.env 内容: 创建config目录,再创建 application.properties 进行挂载. application.properties: 上述代码最后四行是nacos控制台登录验证的 创建docker-compose 文件: 运行:

    2024年02月10日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包