[Desarrollo del sistema Golang] motor de búsqueda (3) tabla de índice invertida comprimida

escrito delante

Supongamos que hay 800.000 artículos en nuestro conjunto de datos, cada artículo tiene 200 entradas, cada entrada tiene 6 caracteres y el número de publicaciones es 100 millones. Luego, si solo registramos la identificación del documento en la tabla de índice invertido, la frecuencia y la información de compensación en el documento no se registran.

Entonces la longitud de la identificación del documento debe ser log 2 800000 = 20 bits log_2800000=20 bitsregistro _ _2800000=20 bits (el documento puede existir para cada artículo, por lo que se requiere la longitud más larga), por lo que el tamaño de toda nuestra tabla de índice invertido sin comprimir es aproximadamente, el número de registros invertidos * tamaño de identificación del documento =100,000,000 * 20/8 = 250 MB

Para diseñar una representación más eficiente de documentos invertidos, se puede considerar que cada documento adopta un método de representación de menos de 20 bits, que se encuentra en las observaciones. La secuencia de identificadores de documentos donde aparecen palabras de alta frecuencia no es muy diferente. Por ejemplo, para la palabra de alta frecuencia "universidad", busquemos un documento que contenga universidades. Quizás después de encontrar una, encontremos otra pronto. La brecha (espacio) entre estos identificadores de documentos no es grande, por lo que podemos considerar usando más de 20 dígitos Una gran cantidad de dígitos al final para representarlo.为了对这种间距分布的情况进行空间压缩,需要使用一种变长编码方法,这种方法可以对短间距采用更短的位数来表示

inserte la descripción de la imagen aquí

1. Código de bytes variable

La codificación VB (byte variable, byte variable) utiliza un número entero de bytes para codificar el espaciado. Los últimos 7 bits del byte son el área de codificación efectiva para el espaciado, mientras que el primer bit es el bit de continuación. Si este bit es 1, indica que este byte es el último byte de un determinado código de espaciado; de lo contrario, no lo es. Para decodificar una codificación de bytes variable, lea una secuencia de bytes en la que los bits de continuación de los bytes anteriores sean todos 0 y el bit de continuación del último byte sea 1. Según la identificación anterior, la parte de 7 bits de cada byte se puede extraer y vincular para formar un código.

El lenguaje go implementa la codificación vb y VBEncodeNumber codifica números enteros en cadenas codificadas en VB.

func VBEncodeNumber(n uint32) string {
    
    
	var bytes []uint32

	for {
    
    
		bytes = append(bytes, n%128+128)
		if n < 128 {
    
    
			break
		}
		n = n / 128
	}

	var by []string
	for i := len(bytes) - 1; i >= 0; i-- {
    
    
		if i < len(bytes)-1 {
    
    
			by = append(by, strconv.FormatUint(uint64(bytes[i]), 2)[1:]+" ")
		} else {
    
    
			by = append(by, strconv.FormatUint(uint64(bytes[i]), 2))
		}
	}

	return strings.Join(by, "")
}

inserte la descripción de la imagen aquí
A través del códec vb, podemos lograr una compresión del 50%.

Supongo que te gusta

Origin blog.csdn.net/weixin_45304503/article/details/132378381
Recomendado
Clasificación