• Acerca de Milvus
  • Comenzar
  • Conceptos
  • Guía del usuario
  • Importación de datos
  • Herramientas de IA
  • Guía de administración
  • Herramientas
  • Integraciones
  • Tutoriales
  • Preguntas frecuentes
  • API Reference

Compactación Force MergeCompatible with Milvus 3.0.x

Force Merge está diseñado para consolidar segmentos pequeños y fragmentados en menos segmentos y más grandes para mejorar el rendimiento de las consultas y la eficiencia del almacenamiento. En esta guía se explica cómo utilizar la compactación de fusión forzada.

Esta función se encuentra en fase de vista previa pública. No la utilice en entornos de producción.

Descripción general

La compactación estándar mantiene el tamaño de los segmentos cerca del configurado en maxSize mediante fusiones múltiples, pero puede dejar fragmentos de tamaño medio que no se pueden fusionar más sin superar los límites. Por ejemplo, como se ilustra a continuación, si una colección tiene cinco segmentos de 2 MB y maxSize es de 3 MB, la fusión de dos segmentos cualquiera superaría el límite, por lo que la compactación estándar no puede reducir más el recuento de segmentos y el diseño fragmentado permanece.

Forzar fusión añade un parámetro target_size y permite reorganizar los segmentos hacia el tamaño deseado dentro de una tolerancia ajustada siempre que sea posible. Como se ilustra a continuación, si el target_size especificado es de 4 MB, los cinco segmentos pequeños de 2 MB se pueden fusionar más en menos segmentos más grandes. Esto reduce el número excesivo de segmentos, admite objetivos mayores que la configuración predeterminada de maxSize y, cuando el objetivo es muy grande, permite al sistema elegir un tamaño de salida y un número de segmentos prácticos para el hardware y la topología de QueryNode actuales.

Para saber qué método de compactación utilizar, consulte las preguntas frecuentes.

R8eow3kaqhktokblcmocnvxmnee R8eow3kaqhktokblcmocnvxmnee

La compactación de fusión forzada amplía la API Compaction API con un parámetro target_size. Es totalmente compatible con versiones anteriores: las llamadas de compactación existentes sin target_size siguen funcionando como antes.

La fusión forzada funciona de forma asíncrona. No bloquea las operaciones de búsqueda o consulta, aunque consume recursos de E/S y memoria durante la ejecución.

Uso de la compactación forzada

Requisitos previos

  • Milvus versión 3.0 o posterior

  • PyMilvus 3.0 o posterior

Configuración global

Los siguientes parámetros de configuración controlan el comportamiento de Force Merge. Establézcalos en el archivo de configuración de Milvus o mediante variables de entorno.

dataCoord:
  segment:
    maxSize: 512         # Default segment max size (MB).
                         # Used when target_size is 0 or omitted.
  compaction:
    maxFullSegmentThreshold: 100
                         # When segment count exceeds this threshold,
                         # a faster greedy algorithm is used instead
                         # of the standard merge algorithm.
    forceMerge:
      datanodeMemoryFactor: 4.0
                         # DataNode memory divided by this factor
                         # determines the the largest segment
                         # size the system can allow.
      querynodeMemoryFactor: 4.0
                         # Minimum QueryNode memory divided by this
                         # factor. Used in automatic size calculation
                         # to ensure merged segments can be loaded.

Parámetro

Valor por defecto

Descripción

dataCoord.segment.maxSize

512

Tamaño máximo del segmento por defecto en MB. Se utiliza como destino cuando target_size es 0 o se omite. También sirve como valor mínimo permitido para target_size explícito.

dataCoord.compaction.maxFullSegmentThreshold

100

Umbral de recuento de segmentos para la selección del algoritmo. Cuando el número de segmentos supera este valor, Milvus utiliza un algoritmo codicioso más rápido para la planificación de la fusión.

  • Algoritmo estándar (utilizado cuando el recuento de segmentos es <= dataCoord.compaction.maxFullSegmentThreshold): produce resultados de fusión más óptimos pero tarda más en calcularse.

  • Algoritmo codicioso (utilizado cuando el recuento de segmentos > dataCoord.compaction.maxFullSegmentThreshold): completa la planificación mucho más rápido a costa de una agrupación de segmentos ligeramente menos óptima.

dataCoord.compaction.forceMerge.datanodeMemoryFactor

4.0

La memoria DataNode se divide por este factor para calcular el tamaño de segmento más grande que el sistema puede permitir.

  • Un valor mayor asigna menos memoria a la fusión pero deja más para otras operaciones del DataNode, mejorando la estabilidad del nodo.

  • Un valor menor permite fusiones más grandes pero aumenta la presión sobre la memoria.

  • Por ejemplo, con el factor por defecto de 4.0 y un DataNode con 16 GB de memoria, el presupuesto de fusión es de 4 GB. Esto significa que el tamaño total de los segmentos que se fusionan en una sola operación no puede superar los 4 GB.

dataCoord.compaction.forceMerge.querynodeMemoryFactor

4.0

La memoria mínima del QueryNode se divide por este factor. Se utiliza durante el cálculo automático del tamaño (target_size=max_int64) para garantizar que los QueryNodes puedan cargar los segmentos fusionados.

  • Un valor mayor produce segmentos más pequeños que son más fáciles de cargar para los QueryNodes.

  • Un valor menor permite segmentos más grandes pero puede causar fallos de carga en QueryNodes con memoria limitada.

  • Por ejemplo, con el factor por defecto de 4.0 y el QueryNode más pequeño con 16 GB de memoria, el tamaño objetivo autocalculado no superará los 4 GB. Esto evita que Force Merge produzca segmentos tan grandes que los QueryNodes no puedan cargarlos.

Para aplicar los cambios anteriores a su cluster Milvus, por favor siga los pasos en Configurar Milvus con Helm y Configurar Milvus con Milvus Operators.

Activar la compactación Force Merge

Puede activar la compactación Force Merge llamando a compact() con el parámetro target_size. Para más detalles sobre el parámetro, véase Referencia de parámetros más abajo.

Existen tres modos de compactación por combinación forzada:

compact("my_collection", target_size=?)
│
├─ Mode 1: target_size = 0 (or omitted)
│  Uses config maxSize (default 512 MB)
│  Equivalent to standard compaction
│
├─ Mode 2: target_size = 2048
│  Merges segments to ~2 GB each
│  Must be >= config maxSize
│
└─ Mode 3: target_size = max_int64
   Auto-calculates optimal size based on
   segment distribution and node memory

A continuación se muestran ejemplos de cómo utilizar cada modo de compactación forzada.

Por defecto (compactación estándar)

from pymilvus import MilvusClient

client = MilvusClient(
    uri="http://localhost:19530",
    token="root:Milvus"
)

# Standard compaction — uses config maxSize (default 512 MB)
job_id = client.compact("target_collection")

Tamaño objetivo explícito

# Merge segments to approximately 2 GB each
job_id = client.compact(
    "target_collection",
    target_size="2048"  # The unit is MB
)

Cálculo automático del tamaño

# Let Milvus determine the optimal segment size
max_int64 = (1 << 63) - 1
job_id = client.compact(
    "target_collection",
    target_size=max_int64
)

Referencia de parámetros

En la tabla siguiente se explican los parámetros.

Parámetro

Tipo

Descripción

collection_name

str

Obligatorio. El nombre de la colección a compactar.

target_size

int

Opcional. El tamaño del segmento objetivo en MB. Hay 3 opciones de valor del parámetro:

  • 0 u omitido: Utiliza el dataCoord.segment.maxSize configurado (por defecto: 512 MB). Equivale a la compactación estándar.

  • Valor explícito: Fusiona segmentos hasta aproximadamente el tamaño especificado en MB (ej. 2048). Debe ser mayor o igual que el configurado dataCoord.segment.maxSize.

  • max_int64 ((1 << 63) - 1): Calcula automáticamente el tamaño óptimo basándose en la distribución actual de segmentos y en los recursos disponibles del nodo.

Si el target_size especificado es menor que el dataCoord.segment.maxSize configurado, la solicitud se rechaza con un error.

Comprobar el progreso de la compactación

La compactación Force Merge se ejecuta de forma asíncrona. Utilice el ID de trabajo devuelto para comprobar el progreso:

# Check compaction state
state = client.get_compaction_state(job_id)
print(f"State: {state}")

Mejores prácticas

  • No utilice la compactación Force Merge en entornos de producción.

  • Utilice el modo de cálculo de tamaño automático para la mayoría de los casos. Configurar target_size en max_int64 permite a Milvus analizar su distribución de segmentos y recursos de nodos para determinar el mejor tamaño. Este es el enfoque recomendado a menos que tenga requisitos específicos de tamaño.

  • Considere la compensación de rendimiento. Forzar la compactación por fusión es una operación que consume muchos recursos. Lee, combina y reescribe datos de segmentos. Prográmela durante periodos de poco tráfico para minimizar el impacto en la latencia de la consulta.

  • Controle el recuento de segmentos antes y después. Utilice get_compaction_state() y list_persistent_segments para verificar que la compactación ha producido menos segmentos y más grandes de lo esperado.

PREGUNTAS FRECUENTES

¿En qué se diferencia Force Merge de la compactación estándar?

Estos dos tipos de operaciones de compactación tienen propósitos diferentes.

  • La compactación estándar (targetSize=0 u omitida) es una ruta de limpieza incremental de máximo esfuerzo.

  • La fusión forzada (targetSize>0) es una ruta de reempaquetado a nivel de colección para producir menos segmentos, más grandes y cercanos al objetivo.

La diferencia clave es la forma de la fusión: la compactación estándar es efectivamente m → 1 por tarea, mientras que la fusión forzada es m → n a través de entradas agrupadas. Esta es la razón por la que la fusión forzada puede resolver disposiciones de segmentos que la compactación estándar no puede. La siguiente tabla compara los dos tipos de operaciones.

Dimensión

Compactación estándar (por defecto)

Fusión forzada

Activador API

targetSize=0 (o no establecido), sin indicador Major/L0

targetSize>0 (MB)

Objetivo principal

Limpieza incremental de fragmentos obvios; mantenimiento rutinario

Consolidación de toda la colección para búsqueda y equilibrio

Origen del tamaño del segmento

DataCoord.segment.maxSize fijo (configuración del servidor)

TargetSize del usuario, luego limitado por maxSafeSize

Validez de los parámetros

Sin ajuste del tamaño del usuario

User targetSize debe ser >= dataCoord.segment.maxSize; en caso contrario, se rechaza.

Límite superior de seguridad

Sólo límite de configuración

maxSafeSize = min(QueryNode mem, DataNode mem) / memory_factor (autónomo sin agrupación: reducido a la mitad)

Forma de fusión

m → 1 por tarea, salida <= configMaxSize

m → n, salidas cercanas a targetSize

Comportamiento del segmento medio

Puede atascarse permanentemente (por ejemplo, dos segmentos del 60% no pueden convertirse legalmente en un segmento del 120%)

Reempaquetar + dividir funciona; no hay patrón "atascado en el 60%

Capacidad de aplanamiento de la colección

Limitada; las ejecuciones repetidas pueden dejar muchos segmentos medios.

Fuerte; diseñado para reducir el número de segmentos y aumentar la plenitud

Conocimiento de la topología

Ninguna

Sí; utiliza QueryNode/replica/disposición en fragmentos

Ajuste del paralelismo de lectura

Ninguno

Ajusta el recuento de salida utilizando queryNodeCount / (replicas × shards) cuando es válido

Caso de uso típico

Limpieza diaria de alto volumen tras escrituras/borrados

Preparación de pruebas, optimización de búsquedas, alineación de paralelismo de carga

Alcance esperado

No se espera un reempaquetado completo de la colección

Destinado a resultados de reempaquetado a nivel de colección

Guía de selección:

  • Elija la compactación estándar para una limpieza incremental de bajo riesgo.

  • Elija la fusión forzada cuando desee explícitamente remodelar la colección en menos segmentos de mayor tamaño alineados con el comportamiento de búsqueda y carga.

¿En qué se diferencia la fusión forzada de la compactación por agrupación?

Lacompactación por agrupación (is_clustering=True) reorganiza los datos dentro de los segmentos basándose en una clave de agrupación para mejorar la poda de búsqueda. La combinación forzada (target_size=N) optimiza el tamaño de los segmentos sin cambiar la distribución de los datos. Sirven para diferentes propósitos y pueden utilizarse conjuntamente: ejecute primero la compactación por agrupación para organizar los datos y, a continuación, Force Merge para consolidar los segmentos resultantes.

¿Puedo ejecutar Force Merge en una colección que se está consultando?

Sí. La combinación forzada se ejecuta de forma asíncrona y no bloquea las consultas. Sin embargo, consume recursos de DataNode y de E/S de disco, por lo que la latencia de las consultas puede aumentar durante la compactación. Para obtener mejores resultados, programe la Fusión forzada durante periodos de poco tráfico.

¿Qué ocurre si establezco un target_size inferior a maxSize?

La solicitud se rechaza con un error. El tamaño objetivo debe ser mayor o igual que el configurado en dataCoord.segment.maxSize.