Go FFI 库 purego 与 goffi 的共存冲突问题记录背景与环境在开发一个依赖 gogpu/wgpu(GPU 计算)和 turso.tech/database/tursogo(本地嵌入式数据库)的项目时,我遇到了一个令人困惑的构建问题。项目同时引入了两个 Go FFI (Foreign Function Interface) 库:
github.com/ebitengine/purego (v0.10.1) —— 由 tursogo 间接引入
github.com/go-webgpu/goffi (v0.5.5) —— 由 gogpu/wgpu 间接引入
构建环境:GOOS=linux, GOARCH=amd64。
问题现象阶段一:CGO 启用时的错误在默认构建(CGO_ENABLED=1)时,出现如下链接错误:
123dlopen_stub: unhandled relocation for goffi_dlopen (type 65 (SDYNIMPORT) rtype 7 (R_CALL))dlsym_stub: unhandled relocation for ...
在 Go 语言中解析 PDF 文件时,很多开发者早期可能会考虑使用 github.com/dslipak/pdf,但该库在处理大文件或复杂 PDF 时存在较为明显的性能问题(如内存占用过高、解析速度慢)。
因此,**建议使用 github.com/ledongthuc/pdf**。它是更为优秀的衍生版本,针对一些性能瓶颈和功能做了优化改进,解析更加稳定和高效。
github.com/ledongthuc/pdf 使用示例下面是一个使用 github.com/ledongthuc/pdf 读取并提取 PDF 中纯文本的完整示例代码:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354package mainimport ( "fmt" "log" "os" "github.com/ledongthuc/pdf")func main() ...
在随着大语言模型(LLM)的爆发,检索增强生成(RAG, Retrieval-Augmented Generation)技术成为了解决模型幻觉、引入私有领域知识的主流方案。而在 RAG 系统中,向量数据库和文档的切分(Chunking)策略起着至关重要的作用。
本文将通俗易懂地介绍向量数据库的基础概念,并深入探讨一种高级的文档检索策略——父子片段检索(Parent-Child Chunking / Small-to-Big Retrieval)。
1. 什么是向量数据库?在传统的数据库(如 MySQL, Elasticsearch)中,我们通常使用关键词匹配进行搜索(比如搜索“苹果”,只能查到包含“苹果”两个字的记录)。
但在 AI 时代,我们需要的是语义搜索。比如搜索“手机”,系统应该能返回“iPhone”或“华为”相关的结果,因为它们在语义上是高度相关的。
向量数据库(Vector Database)就是为了解决这个问题而诞生的:
向量化(Embedding):利用模型将文本、图像、音频等数据转化为一串多维数组(即“向量”)。在多维空间中,语义相近的内容,它们对应的向 ...
问题描述我在ubuntu22打包的镜像在ubuntu22上正常运行,但在CentOS 7上运行时,执行ldd命令时提示无读权限,文件无法执行。
gdbCentOS 7 上调试时提示文件格式不被识别,无法执行。
1234567891011121314151617181920212223root@989437facd87:/app/Salesight/bin# gdb SalesightGNU gdb (Ubuntu 12.1-0ubuntu1~22.04.2) 12.1Copyright (C) 2022 Free Software Foundation, Inc.License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law.Type "sh ...
什么是优先队列?你可以把优先队列想象成“插队”的队伍。普通队列是“先来先服务”,谁先排队谁先走。但优先队列不一样,谁的“优先级”高,谁就能先走。
比如:
医院急诊,病情重的先看。
游戏里,分数高的玩家先上榜。
优先队列常用的实现方法是“堆”,比如二叉堆。
优先队列常见的操作:
加入一个元素(push)
取出优先级最高的元素(pop/top)
在C++里有std::priority_queue,Go语言里可以用container/heap包。
举个例子(Go语言):
1234567891011121314151617181920212223242526272829303132package mainimport ( "container/heap" "fmt")type IntHeap []intfunc (h IntHeap) Len() int { return len(h) }func (h IntHeap) Less(i, j int) bool { return h[i] ...
哈希表入门哈希表(Hash Table)也叫散列表,是一种非常常用的数据结构。我们先从一个简单的例子入手:
假设你有很多学生的名字和对应的学号,你想通过名字快速查到学号。最直接的做法是:
用一个很长的数组 arr,数组下标是名字的第一个字母的 ASCII 码。
写一个函数 f,把名字转成下标。
比如:
123func f(key string) int { return int(key[0])}
这样 arr[f(“Alice”)] 就能存 Alice 对应的学号。
这就是哈希表的雏形。我们可以继续改进:其中 arr就是 hash表,f就是hash函数
哈希冲突但这样有个问题:如果两个名字的首字母一样,比如 “Alice” 和 “Amy”,它们会被放到同一个位置,后面的会覆盖前面的。
用更复杂的哈希函数,比如把所有字符都参与进来:
12345678//合适的哈希函数可以减少哈希冲突func f(key string) int { sum := 0 for i := 0; i < len(key); i++ { ...
NTRIP协议NTRIP 的全称是 Networked Transport of RTCM via Internet Protocol,即 “通过互联网协议进行RTCM网络传输”。
简单来说,它是一种通过互联网实时播发差分校正数据的标准协议和格式。
RTCM: 指的是差分数据遵循 RTCM(海事无线电技术委员会)标准格式。这是一种国际通用的、用于传输差分GPS/GNSS校正数据的标准格式。
Internet Protocol: 意味着它使用常见的互联网协议(如 TCP/IP, HTTP)进行数据传输,而不是传统的无线电(如电台、FM副载波)。
它的主要目的是取代传统的UHF电台、FM副载波等无线差分数据链,利用无处不在的互联网(移动网络、Wi-Fi、以太网)来实现更远距离、更稳定、更灵活的差分数据服务。
NTRIP 的工作原理与流程注册挂载点(NtripClient)请求报文最开始需要向服务端发送一个http请求,用来接收服务端的数据(这是一个长连接)http报文格式为
1234567GET /Mountpoint HTTP/1.1User-Agent: N ...
java中List对象indexOf方法失效事情的起因是在解析excel文件时,想通过这个方法返回对象对应的行号,结果出现了行号不准确的情况
示例1234567891011121314151617181920import java.util.LinkedList;import java.util.List;public class Test { static void func(List<String> list) { for (String s : list) { try { // do something System.out.println("do index: "+list.indexOf(s)+ " hashCode: " + s.hashCode()); } catch (Exception e) { Syste ...
RabbitMQ如何保证消息可靠消息传输的三个过程生产端到MQ,MQ到消息端,消费端消费掉消息,任意过程都可能导致消息传输处理失败。生产端到MQ
事务消息机制:会导致性能降低confirm消息确认机制:生产端投递消息到MQ后,MQ会发送一个确认消息给生产端。问题:MQ接收到消息并处理,但还未刚发送确认消息,或生产端由于网络问题未收到确认消息,生产端无法知道消息是否发送成功。
消息持久化:消息持久化能解决MQ突然挂掉导致内存中的消息丢失,其能让重启后的MQ通过硬盘中的数据恢复,exchange/queue/message均能进行持久化。问题:MQ接收到消息还未来得及持久化到硬盘时挂掉。解决:在发送消息之前先将消息保存到数据,增加status字段,超时时间/重发次数。新问题:MQ成功接受消息,但是确定消息机制执行失败,可能导致消息的重复发送,较为有效的方式是每条消息确定一个字段为唯一ID。
消费端也可以通过ack机制保证消息的可靠性。MQ默认在发出消息后会删除这条消息,而不管消费者是否收到或处理完成,导致消费端消息丢失时MQ也没有这条消息。增加手动ack机制即 ...
Linux的常用命令top命令描述:top命令用于实时显示系统中各个进程的资源使用情况,包括进程ID、内存使用、CPU使用等信息。它是一个动态的性能监控工具,可以帮助用户了解系统的运行状态。
常用操作:
按 q 退出。
按 k 输入进程ID以终止进程。
按 h 查看帮助。
lsof命令描述:lsof 是 “list open files” 的缩写,用于列出当前系统中被打开的文件。它可以用于查看某个端口被哪个进程占用。
示例:
lsof -i :80 查看占用80端口的进程。
lsof /path/to/file 查看哪个进程打开了指定文件。
cd命令描述:cd 是 “change directory” 的缩写,用于切换当前工作目录。
示例:
cd /home/user 切换到绝对路径 /home/user。
cd .. 返回上一级目录。
cd ~ 切换到当前用户的主目录。
ls命令描述:ls 是 “list” 的缩写,用于列出目录中的文件和子目录。
常用参数:
ls -l 显示详细信息(权限、所有者、大小、修改时间等)。
ls -a 显示所有文件,包括隐藏文件。
ls - ...
IBMMQ队列管理器队列管理器是为应用程序提供消息传递服务的程序。使用消息队列接口(MQI)的应用程序可以将消息放置到队列并可从队列中获取消息。队列管理器确保消息可以发送至正确的队列或传递至另一个队列管理器。
队列是存放消息的容器。连接至主管队列的队列管理器的业务应用程序可从队列检索消息或将消息放置到队列。
主题是描述在发布/预订消息中所发布信息的主题的字符串。作为订户,您可以指定一个主题或使用通配符指定主题范围以用于接收您所需的信息。
发布是由应用程序发送至发布/预订引擎的消息。然后,发布/预订引擎将消息发送至任何已预订接收这些消息的应用程序。
预订(官网这样叫,我就这样写吧,正常我们叫订阅吧)预订是一个记录,它包含关于订户感兴趣并希望接收关于其信息的主题的信息。因此,预订信息确定哪些发布内容会转发至订户。订户可以接收来自不同发布者的信息,并且也可以将他们接收的信息发送至其他订户。
通道IBM® MQ 可以使用三种不同类型的通道:消息通道、MQI 通道和 AMQP 通道。
消息通道消息通道是两个队列管理器之间的单向通信链路。IBM MQ 使用消息通道在队 ...








