自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(210)
  • 资源 (8)
  • 收藏
  • 关注

原创 向量数据库中的PQ(Procduct Quantization)

b) 向量数据库中的所有向量,切分后的第一个段(32维度的向量),都取出来,做kmeans,计算它们的中心点,至于这些向量要分成几个区域,就由量化设计者决定了,例如,我决定分为256个区域,那么向量数据库中所有向量都拿出第一个段(32维度的向量),做kmeans,计算出256个中心点后,然后再把所有向量的第一段,分配给这256个区域,怎么分呢?b)数据库中存储着每个段的256个中心点,目标向量的每个段,要计算这个32维向量与每个中心点的距离,即每个段会得到256个距离,这些距离要保存下来。

2024-08-22 20:55:27 574

原创 不同版本gcc、g++的默认支持的std C++标准

我主要是用C++的代码:gcc编译器有个__cplusplus宏,这个宏是个字符串,这个字符串值与它正在使用的的C++标准是有联系的,但是仅仅从字符串比较难看出gcc编译所使用的C++标准,而且当编译时指定-std=选项时,这个宏就会改变,表示当前编译所使用的C++标准,一个版本gcc一般会支持多种C++标准,但是有个默认标准,就是不使用-std选项时__cplusplus宏的值。例如,g++-9可以支持c++98到c++14,g++-11可以支持c++98到c++14。

2024-08-22 17:21:01 238

原创 pgvector 向量索引源码解读

下面就来解读一下pgvector-0.6.0的代码,代码来自简单说一下PG extension的知识,一般来说一个编译好的extension包括control文件、一个sql文件,一个so文件,在PG命令行输入create extension xxx 时,数据会找相应的control文件,加载so文件,然后执行sql文件,可能细节上这一描述有点误差,但这是我理解pgvector插件的一个最简单的模型,而且是有效的,这里我不想深究extension的机制。

2024-07-24 09:21:49 1026

原创 PostgreSQL 的 generic xlog 模块代码解读

在PG源码中,为自定义WAL提供了比较底层的API和编程规范,当用户想要自定义的数据,也具备PG内建数据的种种好处时(例如,故障和恢复,流复制),用户可以使用这套API和编程规范,向WAL buffer中插入自定义的日志记录,恢复时,再提取自己的数据,并觉得如何恢复。这个编程规范背后有个理论知识,为了事务的一致性(单个事务的原子性和并发事务的隔离性),在shared buffer pool里的page(或者任何其它类型的存储)落盘前,要先将修改信息构造成一个WAL记录并落盘。

2024-07-17 17:36:04 821

原创 kind kubernetes(k8s虚拟环境)使用本地docker的镜像

k8s虽然使用docker下载镜像,但是存储在docker image里的镜像是不能被k8s使用的,但是kind不同,可以使用下面的方法,让kind-k8s加载docker image里的镜像。可以用这个kind命令加载docker image里的镜像,到kind-k8s环境里,这样k8s就不会到网上下载镜像了。

2024-07-11 11:39:34 705 1

原创 docker pull 报错:missing signature key,docker版本问题

这两篇文章讲的很好,我照着做,在我的CentOS7.9上成功安装了26.1.4。

2024-07-11 10:47:31 459

原创 如何部署本地dockers镜像源

最近许多公网的docker镜像源不能用了,只有用翻墙的办法去外网下载镜像,docker save导出镜像包,docker load在本地导入,docker push到本地部署的镜像服务器,然后Kubernetes就可以使用本地镜像服务器里的镜像了。这里有个关键步骤,就是搭建本地docker镜像服务器了,鉴于容器部署的便捷性,我们使用容器部署docker镜像服务器。

2024-07-11 10:40:12 885

原创 Helm是个啥

Helm提供了和yum类似的创建应用包的工具,对应yum的打包操作,Helm的“应用程序包”成Chart,Chart打包后可以上传到远程的repository,需要在k8s上安装应用时,就从repository下载Chart。Helm就相当于把kubernetes集群,看作一个Linux系统,执行Helm命令来下载安装“应用”,而这个“应用”是包括各种k8s资源的集群。yum是Linux的应用程序包管理器,可以下载应用程序,有时候还可以配置操作系统让下载的引用程序在后台启动,例如docker等。

2024-06-17 17:46:41 261

原创 pgvector 索引的混合查询

当 where 的条件查询出的记录多到一定程度时(估计selectivity不同了),优化器便会选择另一个执行计划,如下图,会先按照向量索引查询出最近的若干向量,然后再对这些最邻近向量所在行,按其它字段进行条件过滤,这种情况使用了向量索引。在上面的查询中,返回的最邻近向量数只有一个,没有达到5个的需求,在不改变执行计划的前提下,可以增大where的查询范围,即按照向量索引查询后,过滤条件放宽一些,或许可以得到更多结果,然后再用limit选取头几条。可以看到,这里并没有使用pgvector所特有的向量索引。

2024-05-17 14:59:51 281

原创 通过TID查询记录

PostgreSQL的rowid是TID,包括这条记录在表中的页号和页内偏移(item pointer索引),用形如(0,35)的格式给出,在PG中,可以直接用TID查询出记录,例如:其中 ctid 就是指这一条记录的 tid,也可以在查询时显示ctid:

2024-05-17 14:03:02 105

原创 什么是 RAG,大模型微调,向量数据库的应用场景

这一招被实践证明还挺好用,解决了不少问题,这就是所谓的提示词工程(prompt engineering),这个过程有个需求,就是要根据问题文本,查找出和这个问题相关的背景知识文本,很自然的想到,这个查询可以去搜索引擎上查,但是有的公司的数据是私有的,搜索引擎是差不到的,那么其实就要求公司内部建立这么个搜索引擎,这是一个思路,实际上使用和搜索引擎差不多的一个东西,就是向量数据库,把背景知识(小明的妈妈。” 是我们想问大模型的问题,“小明的妈妈有三个孩子,老大叫小军,老二叫小米,老三叫小明。

2024-05-13 17:01:19 447

原创 冗余编码提高通讯可靠性

原来一百年前的人也考虑过这个问题,这个想法有香浓的理论支撑,通过对信息进行冗余编码,即传输更多的信息,原信息装载于这个冗余的信息中,传输这个冗余的信息要传输更多的数据量,但是,这样可以对抗信道中的噪声带来的信号失真,这样既是有些信号失真、有些数据丢失,最终仍能正确的传输想要传输的那部分信息。这个通讯的历史很有意思,要抽时间研究一下!

2024-05-11 17:55:26 170

原创 PG的事务ID回卷逻辑

PG的处理方法,简单的说,就是在事务ID还没用完以前,把数据库中所有的tuple处理一遍,将以前的事务(不活跃的事务)修改的(包括插入)tuple中的事务ID改为2(或设置infomask),表示这个tuple对于以后的事务(不管是多少的事务ID)都是可见的,即freeze。按照上面代码的算法,对于任何事物ID,例如100,如果另一个事务ID比它大,但是没有超过这个事务ID后的半圆,例如2^31+100,就认为是在它的后面,那么事务100的tuple,对事务2^31+100就是可见的。

2024-05-10 15:14:26 420

原创 以系统方式看世界,就是以不同角度看世界

我们在学习一个复杂系统的时候,会把它分成若干小系统,单独研究一个小系统的时候,会尽量不去想它与其它系统的联系和作用,把一个大系统分解成若干小系统的思维,其实也是从不同角度看一个大系统,例如人体的免疫系统,如果只看免疫系统的工作,不考虑运动、神经、消化系统,就是从免疫系统的角度看人体,但是其实各子系统之间是有联系和交互的(否则这些子系统就没有价值了)。有了一定生活经验的人,会知道许多看似是一个整体事物,其实是由若干个小系统组织而成,例如一个汽车,一台电脑,一个人体,一个国家,一门语言。

2024-04-23 09:40:50 160

原创 opengauss pending启动转主备代码分析

在这些信号处理函数中启动线程(walreceiver、walwriter、walsender等),启动线程调用initialize_util_thread() ,可以在postmaster.cpp中搜initialize_util_thread,查看启动线程的位置。而在 pending 状态启动时,就已经调用了与各种 wal record 对应的 resource manager 的redo函数了,也就是说如果有问题,在pending启动时就会有问题。

2024-04-22 17:50:39 163

原创 自主创新就是要先接受自己不完美的解决方案并寻求完善

自主创新就是要接受自己的不足,接受自己的无能为力,并且承担代价,然后逐渐改进,逐渐寻找突破,这也是所谓的工程思维,今天看PG代码时,从README说明里看到许多他们对PG解决一个问题时不足的讨论,他们也承认是有不完美的,但是在一定场景下不会出大问题,问题是,如果不接受这个不完美的解决方案,就被问题卡住,无法前进。当我们自己发明创造解决方案时,也会遇到不完美的解决方案问题,就觉得我们的不行,不如别人的,有时干脆就放弃了,觉得白努力。这其实就是不明白要接受自己的不完美,并持续改进下去。

2024-04-18 17:48:33 166

原创 valgrind 是个啥?

m->msg开始sizeof (struct rawmsg)大小的内存,标记为未定义(初始化)的内存,如果没有这个宏,memcheck仿真cpu会认为这块内存是已经被初始化的,因为前面调用了memset,而memcheck仿真cpu会监视memset,这个宏在需要重用一块内存时使用。当然,不可能真的为进程地址空间的每个字节,分配记录其属性的bitmap,因为这些bitmap本身也占用地址空间的字节,memcheck只记录被客户程序触及到的进程地址空间字节的属性,未触及到的字节的属性,应该有办法压缩表示。

2024-04-09 11:21:44 936

原创 编写 PG extension 时,work_mem 和 maintenance_work_mem的作用

从PG内核编程的角度看,其实backend进程在做上述操作时,也可以不参考这两个参数,而是直接按需分配内存,但是这样,有可能单个backend进程占用的内存太大,把整个计算机的内存都占满了,所以DBA要对每个backend进程占用的内存的上限,做一个限制,当达到这个限制,就采取其它策略,或执行失败,就像单个进程的out of memory。这两个参数在官网都有描述,都是一个backend进程在做工作时,需要用到的内存的参考,也都是给每个backend自己用做参考的,不是全局的。

2024-04-08 15:46:43 279

原创 PG 的 Extension 是个啥?

以前,对于编写PG的Extension一直有一种神秘感,虽然知道PG的Extension,除了SQL脚本创建一堆PG对象外,最难以捉摸的就是so库了,但是对于这个so库到底可以做到哪些,还是不明朗,到底这个扩展能让PG扩展成什么样?是想把PG改成什么样都可以吗?在执行 CREATE EXTENSION XXX 时,PG会先加载so文件,然后执行sql脚本,加载到内存的so文件就是PG内核的一部分了,其中(so)的代码基本上就可以调用PG内核的任何接口函数,使用PG内核提供的基础设施了。

2024-04-07 17:20:58 244

原创 pg_config.h

与pg_congfig.h对应的,还有一个pg_config_manual.h,这个不是configure生成的,一般用于developer调试,里面也可以设置一些编译后不可变的或默认的内核配置。既然是编译时设置,通过修改configure,也可以将git commit的版本号加进去,这样数据库运行时可以查到可执行文件对应的代码版本。这个头文件是编译PG时configure生成的,configure命令行中的设置,可以反映到这个文件中的宏定义。一般用于一些编译后不可变或者默认的PG内核配置。

2024-04-07 16:53:29 138

原创 PG 中的 MAXALIGN 及对齐分配内存(MemoryContextAllocAligned)

它的实现原理也颇为简单,简单地说就是分配略大于 size + alignto 的一块内存,这样,无论返回的地址是否按照 alignto对齐,在这块内存中总能找到alignto对齐的地址,而且这个对齐地址其后面,可用内存一定大于需要的内存size。有时内存地址的对齐,需要大于MAXALIGN,这时可以用 BUFFERALIGN,它返回最接近输入数字(大于)且能整除32的数。在PG源码中,MAXALIGN这个宏,返回最接近输入数字(大于)且能整除8的数,仅此而已。“CPU访问对齐的地址性能更高”

2024-04-07 16:39:12 275

原创 C++ 内存分配时地址对齐

如果希望在堆中分配的内存时,返回地址按照特定长度对齐,可以使用 aligned_alloc。因此在C++中,有时会希望在堆或栈中分配内存时,返回的地址能按照特定的长度对齐。如果数据地址的对齐与CPU相兼容,那么CPU读写内存时性能会更高。// 输出的地址总是按照4096对齐。

2024-04-07 14:23:08 239

原创 在 PostgreSQL Extension 中使用 MemoryContext

MemoryContext可以理解成是一种类,整个backend进程,以它为节点连城一个树型结构,没个模块的内存分配创建一个MemoryContext,挂到backend的树中,然后这个模块所以需要的内存都在这个MemoryContext里分配,当这个模块的生命周期结束,就销毁这个MemoryContext,在其中分配的内存也全部被释放,如果这个MemoryContext由子树,子树所管理的内存也一起释放。

2024-04-07 13:52:25 181

原创 编译时表达式 constexpr

1、用constexpr修饰的函数或变量,表示可以在编译时计算,但是,如果代码中有对于这个函数的调用,并不意味着编译时一定会执行这个函数,只有这个函数返回了一个变量,然后代码中调用这个函数将返回值赋值给constexpr变量,才会导致编译时执行这个语句。2、除了上述特性,constexpr修饰的变量和函数,隐式的具备了const和inline的特性。// 这句编译时不会执行,只有运行时才会执行。有些傻逼为了用C++的新特性而用新特性,错误的使用constexpr会导致误解,非常蛋疼。

2024-04-02 17:04:30 202

原创 运行时断言(assert)与编译时断言(static_assert)

在代码中写assert,debug版本不定义NDEBUG,release版本定义NDEBUG,这就是assert的使用场景。assert是运行时断言,如果在编译时定义了NDEBUG宏,则assert语句会被忽略掉(丢弃)。static是编译时断言,用来判断编译时的constexpr,如果断言中是false,则编译错误。这里所描述的是GNU编译器。

2024-04-02 16:16:59 268

原创 gdb 打印C++ std::vector里的元素

参考上面的文章,总结如下:$2 = 78$3 = 78$4 = 0$5 = -53。

2024-03-29 11:34:16 384

原创 RMAN 备份恢复、删除归档

通过设置备份策略,决定哪些备份是obsolete,obsolete的备份并不会自动删除,需要手工删除:list backupreport obsoletedelete obsolete使用RMAN既可以做单独的tablespace备份,datafile备份,也可以做全库备份:backup database format '/u01/app/oracle/backup-rman/db_%d_%T_%U.bak';或直接backup database;会备份到db_recovery_file_

2024-03-26 11:33:35 1492

原创 制作 configure 文件极简教程

如果要发布自己的源码,而自己的源码想通过configure,make,make install 编译安装,那么要为自己的源码建立 configure 文件,这个configure 文件不是手写的,而是autoconf生成的,这个生成过程是怎样的呢?上面的文章就举了一个极简的例子,让人有个很快的初步认识。

2024-03-25 17:43:10 275

原创 Makefile的override

将的很好,简单的说,如果在Makefile中有override CPPFLAGS +=-fPIC,无论用户在 make CPPFLAGS=XXX 这里怎样设置,最终编译时都会把-fPIC加到CPPFLAGES里,一般用于添加通用的选项。简单的理解就是编译时要加 -fPIC,告诉编译器生成Position Independent Code,试过。可以成功编译,不过看到其它的解决方案是在Makefile中加。

2024-03-25 16:26:30 305

原创 Oracle 数据泵 导入导出 最简说明

数据泵可以对含有CLOB,BLOB等字段的表导出数据,是应用场景最广的一种导入导出方法,我觉得要比SQL Developer好用,不过需要能够登录数据库所在主机的操作系统。

2024-02-28 18:28:02 616

原创 Unix Domain Socket 比 localhost(127.0.0.1)更快

2、localhost(127.0.0.1)和本机IP是一样的,虽然不走网卡,但是都要走内核的 TCP/IP协议栈,这带来一定的CPU开销。1、localhost(127.0.0.1)、本机IP 和 Unix Domain Socket 都是不走网卡的,这节省了网卡的IO。使用socket进程间通讯,有很好的兼容和复用性,本机的socket进程间通讯,最好选用Unix Domain Socket。

2024-02-28 15:01:05 529

原创 什么是代码混淆

code obfuscation 指将代码中有描述性,易于理解的变量名、函数名、类名等,替换成毫无意义的字符串,让阅读代码的人难以读懂,提出这个概念的人认为这样可以保护脚本的逻辑不被人盗取,尤其是网页脚本。

2024-02-28 09:28:30 176

原创 OpenEuler 静默安装 Oracle19c

我一般都是用runInstaller和dbca的图形界面安装Oracle,但是这次安装,受到网络限制,不能用弹出窗口,只能用静默方式,还是使用这些可执行程序,不过要加一个 -silent 选项,参考了网上的文章,加上自己的实际情况,Oracle19c的静默安装包括四部分:1、runInstaller 静默安装软件19c软件包2、netca静默配置网络3、dbca静默建库4、导入表结构和数据。

2024-02-23 16:59:16 1652

原创 Doris中的本地routineload环境,用于开发回归测试用例

上面这些都弄好后,执行 ./run-thirdparties-docker.sh -c kafka,就会下载镜像,创建kafka和zookeeper的容器,配置好网络,并向kafka写入数据,这些数据在 doris/docker/thirdparties/docker-compose/kafka/scripts 目录下,对应着 doris/regression-test/suites/load_p0/routine_load/ 里的测试用例用到的表。

2024-02-05 17:22:35 972

原创 使用debezuim,实现PG同步Oracle

还可以将逻辑变更读出,给自己写的应用程序,例如jdbc就有逻辑复制功能,debezuim就是利用这个功能。jdbc的逻辑复制其实是利用了logical decoding功能,需要一个插件,调用插件时向它传参数,每个插件的参数会不同。使用wal2json直接decode出来的,是完整的数据,但是到了debezuim,就只有很短的字符串了。逻辑复制有一个限制是,不能捕获大对象变更,但是这里不要误会,表中的bytea列不是大对象,这种列可以存1g的数据,但它不算大对象,大对象是另一种概念。

2024-02-05 11:40:52 448

原创 记 doris 加载压缩文件(lzo、snappy)pr

这里要分清两个概念:lzo是压缩算法,它只管把一块大的数据压缩成一块小的数据,但是要把一个文件分成几个数据块来压缩,压缩以后怎么保存到磁盘,以便于解压缩,这些lzo是不管的,也不会做规定,于是就有了lzop,它是一个把普通文件做lzo压缩和解压的工具(可执行程序),它定义了保存lzo压缩文件的格式,可以理解lzop是保存用lzo压缩算法压缩以后的数据的一个容器(包装盒),而这个lzop也是有格式的。解压时,接受一个已压缩的数据块,解压以后的数据块,放在另一个内存地址,解压后的大小,作为参数返回。

2024-02-01 16:14:09 978

原创 单机搭建hadoop环境(包括hdfs、yarn、hive)

然后,下载hadoop安装包,这个包就包括了hdfs服务器和yarn服务器的执行文件和配置脚本。首先,要配置好Java的JAVA_HOME和PATH(etc/hadoop/hadoop-env.sh里的JAVA_HOME要改为本机的JAVA_HOME),还是有ssh本机的免密码登录。etc/hadoop/hdfs-site.xml (dfs.namenode.name.dir 和 dfs.namenode.data.dir)是服务器上存储元数据和数据的目录。yarn服务器,yarn的前提是hdfs服务器,

2024-01-28 16:56:36 1939

原创 为什么需要数据仓库

OLTP环境也会存储历史数据,但这些历史数据并不是业务运行所需的,这些历史数据需要经常归档到数据仓库,并且在OLTP数据库中删除。相比之下,事务环境适用于连续处理事务,通常应用于订单录入以及财务和零售事务。它们并不依赖历史数据。环境下,用户常常需要归档历史数据,或删除历史数据来提高性能。

2024-01-22 14:32:24 635 1

原创 docker 和 k8s

https://www.runoob.com/docker/docker-architecture.htmldocker由dockerd来接受客户端的命令,它可以下载、管理镜像,创建、管理容器。由一个镜像可以创建多个容器,系统中运行的虚拟实体,就是容器。dockerd也可以管理容器与宿主机之间的端口,网络,目录映射。每个容器由自己的ip吗?是的容器可以启动,也可以停:docke...

2024-01-22 14:28:08 846 1

原创 Doris 的 RPC

gRPC 的 message 和 thrift 的 struct 定义的结构体数据,转化为 java、cpp 代码后,类型名称都不变,且FE、BE中都是相同的名称,内部结构也相同,thrift 以 T 开头,gRPC 以 P 开头,都可以在 gensrc 下搜索到,注意,sourceinside,不具备分析 proto 和 thrift 源文件的能力。RPC调用存在一个同步调用和异步调用问题,thrift 和 gRPC 都支持同步和异步,客户端和服务端都有对应的同步和异步接口。

2024-01-22 14:27:46 512

CMU 5-721 Advanced Database System 课件PPT(1-25课完)

数据库实现,CS 5-721 PPT,Prof. Andy Pavlo

2024-01-18

POI数据集PostGIS数据集

经纬度点,数据集,PostGIS经纬度测试数据,坐标,亲测可用 1,百里香奶油草莓基地,劳动路707弄169临,31.44512325,121.3128429,上海市;嘉定区,公司企业;公司企业,13738470228 10,EVCARD电动汽车分时租赁,亨嘉庄东南50米(徐星路西),31.47498901,121.2580786,上海市;嘉定区,生活服务;其它生活服务, 19,上海野生动物园游客服务中心,南六公路178号,31.05707954,121.7114324,上海市;浦东新区,休闲娱乐;旅游景点, 28,南汇?界浜水蜜桃基地,沔新路与申瓦路交叉口南150米,31.131024

2020-09-25

Adobe AIR Scratch2必备

Adobe AIR windows下安装文件,安装Scratch2必备环境。

2018-02-26

mysql expert

mysql expert 代码,mysql expert 代码,mysql expert 代码

2017-10-11

SQ_Guide_M5

guide m5

2017-08-28

postgreSQL源码

PostgreSQL from github

2017-08-23

Database System The Complete Book 2nd Edition

数据库实现的好书

2017-08-17

Making it Big in Software

Making it Big in Software好书

2017-08-17

bc开发工具

bc开发工具

2017-08-17

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除