既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
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
- 将共享库文件复制到 PostgreSQL 的共享库目录中:
cp cosine_distance_c.so `pg\_config --libdir`/.
# 实际查询
root@a0e33689b846:/# pg\_config --libdir
/usr/lib/x86_64-linux-gnu
- 在 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 类型的一维数组。在实际应用中,你可能需要进行更多的参数校验和错误处理,并支持更复杂的数组类型和维度。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
/bbs.csdn.net/topics/618668825)**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!