容量规划
在设置集群时,您需要找到 RAM 和 磁盘存储 的合适平衡点。最佳设置取决于几个因素
- 您拥有的向量数量及其维度。
- 您使用的载荷数据量及其索引。
- 您希望将哪些数据存储在内存中,哪些存储在磁盘上。
- 您的集群的复制设置。
- 您是否使用了量化以及如何设置的。
计算 RAM 大小
您应将频繁访问的数据存储在 RAM 中,以实现更快的检索。如果您想将所有向量保存在内存中以获得最佳性能,可以使用这个粗略的公式进行估算
memory_size = number_of_vectors * vector_dimension * 4 bytes * 1.5
最后,我们将所有内容乘以 1.5。这额外的 50% 考虑了元数据(如索引和点版本)以及优化期间创建的临时段。
假设您想存储 100 万个维度为 1024 的向量
memory_size = 1,000,000 * 1024 * 4 bytes * 1.5
memory_size 大约为 6,144,000,000 字节,或约 5.72 GB。
根据用例的不同,大型数据集可以通过量化减少内存需求从而获益。
计算载荷大小
这总是不同的。载荷的大小取决于数据的结构和内容。例如
- 文本字段 根据长度和编码消耗空间(例如,一大段文本 vs 几个单词)。
- 浮点数 的大小固定,
int64
或float64
占 8 字节。 - 布尔字段 通常消耗 1 字节。
计算总载荷大小与向量类似。我们需要将其乘以 1.5 用于后端索引过程。
total_payload_size = number_of_points * payload_size * 1.5
假设您想存储 100 万个 JSON 载荷大小为 5KB 的点
total_payload_size = 1,000,000 * 5KB * 1.5
total_payload_size 大约为 5,000,000 字节,或约 4.77 GB。
选择磁盘而非 RAM
为了获得最佳性能,您应该只将频繁访问的数据存储在 RAM 中。其余数据应卸载到磁盘。例如,不用于过滤的额外载荷字段可以存储在磁盘上。
只有索引字段应该存储在 RAM 中。您可以在存储部分阅读更多关于载荷存储的信息。
以存储为中心的配置
如果您的优先事项是以平均搜索延迟处理大量向量,建议配置内存映射(mmap)存储。在此设置中,向量存储在磁盘上的内存映射文件中,而只有最常访问的向量被缓存到 RAM 中。
可用 RAM 的大小极大地影响搜索性能。通常来说,如果将向量存储在 RAM 中的数量减半,搜索延迟大约会翻倍。
磁盘速度也非常关键。如果您在我们的云服务中有针对大容量搜索的特定需求,请联系我们。
以子组为中心的配置
如果您的用例涉及根据载荷值将向量分成多个集合或子组(例如,为多个用户提供搜索服务,每个用户都有自己的向量子集),则建议使用内存映射存储。
在这种情况下,只有活动的向量子集会被缓存到 RAM 中,从而为最新和活跃的用户提供快速搜索。您可以估算所需的内存大小如下
memory_size = number_of_active_vectors * vector_dimension * 4 bytes * 1.5
请参考我们的多租户文档,了解更多关于 Qdrant 中数据分区的信息。
在 Qdrant Cloud 中扩展磁盘空间
支持向量搜索的集群需要比其他搜索系统更大的磁盘空间。如果您的磁盘空间不足,可以使用 cloud.qdrant.io 上的 UI 来扩展您的集群。
当磁盘空间不足时,考虑扩展的以下好处
- 更大的数据集:支持更大的数据集,这可以提高搜索结果的相关性和质量。
- 改进的索引:支持使用 HNSW 等高级索引策略。
- 缓存:通过增加 RAM 来提高速度,允许缓存更频繁访问的数据。
- 备份和冗余:有助于更频繁的备份,这对数据安全来说是一个关键优势。
请始终记住增加向量大小的 50%。这用于存放索引和在向量插入、删除、搜索等操作期间使用的辅助数据。因此,包含元数据的估计内存大小为
total_vector_size = number_of_dimensions * 4 bytes * 1.5
免责声明
以上计算至多是估算。如果您需要更准确的数字,应始终在实践中测试您的数据集。