优化器
批量应用更改比像许多其他数据库那样单独执行每个更改效率高得多。Qdrant 在这方面也不例外。由于 Qdrant 操作的数据结构并非总是易于更改,因此有时需要完全重建这些结构。
Qdrant 中的存储优化发生在段级别(参见存储)。在这种情况下,待优化的段在重建期间仍然可读。
通过将段封装在一个代理中来实现可用性,该代理透明地处理数据更改。更改的数据放置在写时复制段中,该段在检索和后续更新中具有优先级。
Vacuum 优化器
需要重建段存储库的最简单示例是删除点。像许多其他数据库一样,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 允许您根据记录数量选择使用的索引类型和数据存储方法。因此,例如,如果点数少于 10000,使用任何索引的效率都会低于暴力扫描。
当达到最小记录量时,索引优化器用于实现索引和内存映射存储的启用。
优化器启动的条件在配置文件中定义。
以下是参数值的示例
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
除了配置文件,您还可以为每个集合单独设置优化器参数。
动态参数更新可能很有用,例如,为了更有效地初始加载点。您可以使用这些设置在上传过程中禁用索引,并在完成后立即启用它。这样,您就不会浪费额外的计算资源来重建索引。