如何让 SQLite Grind 百万向量 搭载 5 VPS 的 2GB RAM (和 不从记忆外死亡)

2026年8月20日2 次浏览来源:Dev.to阅读原文

想象一下,你有一个廉价的虚拟机,拥有2GB的RAM,绝对没有交换空间,以及一个雄心勃勃的目标:运行一个分布式的AI搜索引擎,能够处理和向上传上千个收到的文件("Harvest"管道).

大多数开发者在听到"vector search"等词后,立即急于部署pgvector,Pinecone,或Milvus等重型企业解决方案.

然而,在一台2GB的RAM机上,这些内存饥饿的怪物会从一个出自记忆(OOM)的出错中坠入,直到他们甚至完成初始化.

对于NGP 4.5(NetGlyph Knowledge Protocol),我们决定接受极端最小化,选择了经过战斗测试,时间证明的SQLite.

在文章中,我们将展示我们如何调制嵌入式数据库, 处理每秒数百个交易, 完全消除文件描述器漏出, 并保持内存消耗平平 在可忽略不计的幅度。

1.

灾难的解剖学:在开发向量引擎()和文件向量器期间,我们遇到一个典型的建筑摩擦点。

我们的AI代理之一("Hermes"),负责自动导入数据,存储这样的向量: 这密码怎么了?

幽灵连接 : 仅获取当前格式化的时间, 引擎就绕了一条狂野的绕道: 它通过参数列表直接打开了一个全新的独立连接, 运行了对 SQL 函数的查询, 然后...

使连接打开 。

文件描述器漏出:这些挂起的连接中每一个都有一个文件描述器打开.

在微小的2GB VPS上,处理出一串2,258个文档后,操作系统已耗尽了文件描述符和内存.

OOM崩溃: OS内核会无情地终止我们的进程 之前我们甚至可以处理第一批100份文件。

2.

补丁:土著电话和背景管理人员 拯救系统的第一步是彻底重构我们如何管理数据库连接。

我们把基于SQL的人工时间请求替换为轻量级,本土的Python系统呼叫,并迁移到安全,平庸的上下文管理器.

优化解决方案(Optimal Solution: What changed):保证即使交易期间发生崩溃,出错,或数据库腐败,Python也会自动承诺(或回滚)并关闭文件描述符.

原生时间戳:引用是一个令人难以置信的快速,纳米二级OS内核系统调用.

我们切除SQL查询解析,并保存了珍贵的CPU周期,用于实际向量化.

3.

调整"光-重"SQLite配置 为了让SQLite在超受限硬件上作为高速,并发的嵌入式引擎来运行,默认的出箱设置根本无法剪接.

以下是我们最优化的"Light-Wight"配置,它挤压了我们2GB RAM服务器上的最大性能: 解释PRAGMA Magic::: 写-Ahead Digging允许读者线程在作者线程执行时同时查询数据库.

这对多行向量搜索绝对至关重要 : 在廉价的服务器上, 您不能让进程映射数千兆字节的原始数据库文件进入内存 。

一个 256MB 限制将最热的索引和表格直接映射在进程的地址空间中,给您次毫秒访问时间而无需冗余的 I/O 操作. :隐藏的 SQLite 语法黑客.

标准正值设置了多页的缓存,但负值严格执行了Kibibytes中的限制 ().

这是我们的防记忆漏出盔甲 数字 : 与WAL相结合,是完全持久和安全的。

数据库在应用程序崩溃时仍然保持一致,但VPS磁盘免于不断的块级系统呼叫.

4.

多线程和种族条件 在分布式代理系统中,多个工人同时向数据库发函.

为了避免恐惧,我们实施了一个两级防御:如果另一个线程锁定数据库,SQLite不会立刻崩溃.

相反,它等待长达5秒的时间来清除锁。

我们隔离所有写作操作 insi

分享