优化 Collection
optimize() 方法将 Flat 暂存区中累积的向量合并构建到配置的向量索引中,从而提升检索性能。该操作在后台运行,不会阻塞读取或写入操作,从而确保应用程序始终保持响应。
为什么需要优化
在 Zvec 中,新插入的向量不会直接添加到已配置的向量索引中。这些新向量会先被暂存到一个轻量级的 Flat 索引 (暴力检索)缓冲区。
这种设计带来了显著的优势,但也伴随着一定的取舍:
- ✅ 优势
- 最大化写入吞吐量:实现高速数据写入。
- 流式写入:为原生不支持流式增量更新的索引类型 (如 IVF),提供实时写入的能力。
- ⚠️ 取舍
- 搜索性能随写入量衰减:随着 Flat 暂存区增长,搜索性能会下降。
🔁 解决方案
定期调用 optimize()。这会触发后台工作线程,将暂存区中的向量合并到已配置的向量索引中 — 且不会中断正在进行的读写操作。🚀
optimize() 是一个同步方法 (仅在优化完成后才返回),但它不会锁定 collection。
其他线程可以继续无感地读取、写入和查询 — 应用程序将保持完全响应。
使用示例
import zvec
collection = zvec.open(path="/path/to/my/collection")
# 插入一些 documents
for i in range(1000):
doc = zvec.Doc(id=f"doc_{i}", vectors={"embedding": [i + 0.1, i + 0.2, i + 0.3]})
collection.insert(doc)
# 优化 collection
collection.optimize() 检查索引状态
使用 stats 属性获取 collection 索引状态的实时信息:
print(collection.stats)何时调用 optimize()
定期执行优化,但不宜过于频繁:
- 频率过低 → Flat 缓冲区过大,导致检索性能下降
- 频率过高 → 浪费资源,过早优化小批量数据
请根据您的数据写入速率和查询延迟要求进行权衡。
最佳实践:
如果感觉检索速度变慢,请检查 collection 索引状态。
原则上,建议在未索引 documents 数量达到10万条以上时进行优化 — 但请务必根据您的具体业务场景灵活调整。