从零实现一个向量搜索引擎
把前几篇的算法组装起来,构建一个真正可用的向量检索系统。
发布来自土法炼钢兴趣小组的知识、笔记、进展和应用。主题包括数据结构和算法、编程语言、网络安全、密码学等。
共 8 篇文章 · 返回首页
把前几篇的算法组装起来,构建一个真正可用的向量检索系统。
Nginx 用一个进程处理 10 万个并发连接,核心就是 epoll。但 epoll 的 O(1) 性能不是魔法——它用红黑树存储监控集合,用链表收集就绪事件,用回调避免轮询。三个数据结构各司其职,精妙得像一台钟表。
你的服务在线上跑了三天,RSS 从 2GB 涨到了 6GB,free 显示内存快爆了,但业务量没变。你重启'修好了',然后下周又涨回去。问题不在你的代码里——问题在 malloc 里。
拿仓库里现成的 io_uring echo server 做基线,一行一行往 Rust 翻。记录编译器拦下来的五个瞬间——每一个都对应 C 版本里一个真实的 crash 或泄漏风险。Rust 的价值不在更快,在更难把雷带到线上。
Rust 的所有权系统在 FFI 边界会失效——一旦指针跨过 extern \"C\",borrow checker 就看不到了。本文从 bindgen 自动生成绑定、cbindgen 导出 Rust 接口、内存所有权跨语言传递,到为 C 库编写安全的 Rust wrapper,系统拆解 FFI 实战中的每一个坑。
从 Future::poll 到 work-stealing 调度器,从 Waker vtable 到 mio/epoll I/O 驱动,再到层级时间轮——一层一层拆开 tokio 约 40000 行代码的运行时内核,看看你每写一个 .await 背后到底发生了什么。
safe Rust 的编译器保证有边界。当你做 FFI、裸指针、手动内存布局时,这些保证全部消失。这篇讲怎么在 unsafe 里活着回来。
不是'谁快'——而是'什么维度上谁更合适'。在延迟、吞吐量、内存占用、编译速度、并发模型五个维度上正面对比,用同一个任务的三种实现说话。