容量规划
在设置集群时,您需要找到 RAM(内存) 和 磁盘存储 之间的最佳平衡点。最佳配置取决于以下几个因素:
- 您拥有的向量数量及其维度。
- 您使用的负载(Payload)数据量及其索引情况。
- 您希望将哪些数据存储在内存中,哪些存储在磁盘上。
- 集群的副本设置。
- 是否使用了量化(Quantization)以及具体的配置方式。
计算 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。
根据具体用例,大数据集可以通过 量化 技术减少内存需求。
计算负载(Payload)大小
这一项各不相同。负载的大小取决于 数据的结构和内容。例如:
- 文本字段:占用的空间取决于长度和编码(例如,大段文本与几个单词的区别)。
- 浮点数:
int64或float64的固定大小为 8 字节。 - 布尔字段:通常占用 1 字节。
计算总负载大小的方法与计算向量类似。为了后端索引处理,我们需要将其乘以 1.5。
total_payload_size = number_of_points * payload_size * 1.5
假设您要存储 100 万个点,每个点带有 5KB 的 JSON 负载:
total_payload_size = 1,000,000 * 5KB * 1.5
total_payload_size 约为 5,000,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 界面来 向上扩展 (Scale Up) 集群。
当磁盘空间不足时,考虑向上扩展的以下好处:
- 更大的数据集:支持处理更大的数据集,从而提高搜索结果的相关性和质量。
- 改进的索引:支持使用 HNSW 等高级索引策略。
- 缓存:通过增加 RAM 来提高速度,从而允许缓存更多频繁访问的数据。
- 备份与冗余:支持更频繁的备份,这是数据安全的关键优势。
请务必记住增加向量大小的 50%。这涵盖了索引和操作(如向量插入、删除和搜索)过程中使用的辅助数据。因此,包含元数据的预估内存大小为:
total_vector_size = number_of_dimensions * 4 bytes * 1.5
免责声明
上述计算仅为估算值。如果您需要更准确的数据,请务必在实践中对您的数据集进行测试。