优化器

批量应用更改比像许多其他数据库那样单独执行每次更改要高效得多。Qdrant 在这方面也不例外。由于 Qdrant 使用的数据结构并非总是易于修改,因此有时需要完全重建这些结构。

Qdrant 中的存储优化发生在段(segment)级别(参见存储)。在这种情况下,要优化的段在重建期间仍然可读。

Segment optimization

可用性是通过将段封装在一个代理中实现的,该代理透明地处理数据更改。更改后的数据被放入写时复制(copy-on-write)段中,该段在检索和后续更新时具有优先权。

Vacuum 优化器

需要重建段仓库(repository)的最简单例子是移除点。像许多其他数据库一样,Qdrant 不会在查询后立即删除条目。相反,它会将记录标记为已删除,并在未来的查询中忽略它们。

这种策略使我们能够最大限度地减少磁盘访问——这是最慢的操作之一。然而,这种策略的一个副作用是,随着时间的推移,已删除的记录会积累,占用内存并减慢系统速度。

为了避免这些不利影响,使用了 Vacuum 优化器。如果段中积累了太多已删除的记录,就会使用它。

启动优化器的标准在配置文件中定义。

以下是参数值的示例

storage:
  optimizers:
    # The minimal fraction of deleted vectors in a segment, required to perform segment optimization
    deleted_threshold: 0.2
    # The minimal number of vectors in a segment, required to perform segment optimization
    vacuum_min_vector_number: 1000

合并优化器

服务可能需要创建临时段。例如,在优化过程中就会创建这样的写时复制段。

拥有至少一个 Qdrant 用于存储频繁更新数据的小段也很重要。另一方面,太多的小段会导致次优的搜索性能。

如果当前段的数量过多,合并优化器会不断尝试减少段的数量。所需的段数量由 default_segment_number 指定,默认为 CPU 数量。优化器可能会选取至少三个最小的段并将它们合并为一个。

如果段的大小超过配置的最大段大小 max_segment_size_kb,它们将不会被合并。这可以防止创建过大而无法有效索引的段。如果你有大量数据,增加此数值可能有助于减少段的数量,并潜在地提高搜索性能。

启动优化器的标准在配置文件中定义。

以下是参数值的示例

storage:
  optimizers:
    # Target amount of segments optimizer will try to keep.
    # Real amount of segments may vary depending on multiple parameters:
    #  - Amount of stored points
    #  - Current write RPS
    #
    # It is recommended to select default number of segments as a factor of the number of search threads,
    # so that each segment would be handled evenly by one of the threads.
    # If `default_segment_number = 0`, will be automatically selected by the number of available CPUs
    default_segment_number: 0

    # Do not create segments larger this size (in KiloBytes).
    # Large segments might require disproportionately long indexation times,
    # therefore it makes sense to limit the size of segments.
    #
    # If indexation speed have more priority for your - make this parameter lower.
    # If search speed is more important - make this parameter higher.
    # Note: 1Kb = 1 vector of size 256
    # If not set, will be automatically selected considering the number of available CPUs.
    max_segment_size_kb: null

索引优化器

Qdrant 允许您根据记录数量选择使用的索引类型和数据存储方法。例如,如果点(points)的数量少于 10000,使用任何索引都不如暴力扫描(brute force scan)高效。

当达到最少记录数量时,索引优化器用于实现启用索引和内存映射(memmap)存储。

启动优化器的标准在配置文件中定义。

以下是参数值的示例

storage:
  optimizers:
    # Maximum size (in kilobytes) of vectors to store in-memory per segment.
    # Segments larger than this threshold will be stored as read-only memmaped file.
    # Memmap storage is disabled by default, to enable it, set this threshold to a reasonable value.
    # To disable memmap storage, set this to `0`.
    # Note: 1Kb = 1 vector of size 256
    memmap_threshold: 200000

    # Maximum size (in kilobytes) of vectors allowed for plain index, exceeding this threshold will enable vector indexing
    # Default value is 20,000, based on <https://github.com/google-research/google-research/blob/master/scann/docs/algorithms.md>.
    # To disable vector indexing, set to `0`.
    # Note: 1kB = 1 vector of size 256.
    indexing_threshold_kb: 20000

除了配置文件,您还可以为每个集合单独设置优化器参数。

动态参数更新可能很有用,例如,对于更高效的点(points)初始加载。您可以在上传过程中使用这些设置禁用索引,并在完成后立即启用它。因此,您不会在重建索引上浪费额外的计算资源。

本页是否对您有帮助?

感谢您的反馈!🙏

很抱歉听到这个消息。😔 您可以在 GitHub 上编辑此页面,或创建一个 GitHub issue。