[Serie C ++] 86. El procesamiento de datos de masas

0. Introducción

El artículo incluía una serie de largo plazo estará en datos masivos procesamiento de los problemas comunes, es fácil que se le pregunte en la entrevista, grabada queremos hacer para ayudar al lector.

1. Aplicación de un mapa de bits

1. 10 mil millones al entero dado, entero algoritmos de diseño para encontrar sólo aparecen una vez?

  • método uno
  • Los problemas encontrados enormes cantidades de datos, primero debe analizar el tamaño de los datos. Si necesitamos para almacenar una intvariedad de todos los datos, a saber 4Glos datos, sólo tenemos 4G / 8 = 512Mespacio suficiente.
  • Dependiendo de la naturaleza del mapa de bits, se utiliza un mapa de bits no puede obtener un sólo aparecen entero. Aquí es fácil pensar en dos mapas de bits prácticas:
    • 1 mapa de bits para determinar si existe una digital, se produce cuando la posición correspondiente se establece
    • 2 de mapa de bits para determinar si el número de nuevo, cuando el bit correspondiente es 1 en la Fig. 1 tiene, y los vuelve a aparecer de números, es decir, el mapa de bits se fija 2
  • De esta manera se pueden encontrar para obtener sólo un surgimiento entero de dos usaron 512Mmapas de bits, por lo que extra de 1Gespacio

  • Segundo método
  • Este problema también se puede utilizar un gran mapa de bits que debe resolverse antes de que el 512Mrendimiento de mapa de bits de inttodos los casos de datos de tipo, pero sólo apareció en el rendimiento, y no puede mostrar más de una vez. La razón es el único bit para indicar, entonces sólo puede producir 0, 1 estos dos casos, aquí usamos dos el número de bit que indica la aparición de un caso, se puede obtener en este caso 4, aparece 0,1,2,3 veces, lo que es el resultado combinado de dos mapas de bits ordinarios, para hacerlo es 1Gel espacio. Refiriéndose a lograr nuestro mapa de bits común [ Serie C ++] 84. El concepto y aplicación del mapa de bits poca transformación puede resolver el problema.

Ver el código de abajo:

#include<stdio.h>
#include<assert.h>
#include<windows.h>

typedef struct TwoBitSet
{
	// 数组
    size_t *bts;
    // 数据的范围
    size_t range;
}TwoBitSet;

void TBSInit(TwoBitSet *tbs,size_t range)
{
    assert(tbs);
    // 需要两位表示一个数据,所以除以16,
    // (range >> 4) + 1计算需要多少个整型
    tbs->bts = (size_t *)malloc(((range >> 4) + 1) * sizeof(size_t));
    assert(tbs->bts);
    memset(tbs->bts, 0,((range >> 4) + 1) * sizeof(size_t));
    tbs->range = range;
}
int TBSGetValue(TwoBitSet *tbs, size_t x)//
{
    assert(tbs);
    // 计算x在数组里下标
    size_t index = x >> 4;
    // 因为两位表示一位,需要乘2
    size_t num = x % 16 * 2;
    // 不能改变tbs->bts[index],所以设置value
    int value = tbs->bts[index];
    // 将value向右移
    value >>= num;
    // 任何数和3(11)&为任何数
    return value & 3;
}
void TBSSetVaule(TwoBitSet *tbs, size_t x, size_t value)//设置值
{
    assert(tbs);
    // 计算x在数组里下标
    size_t index = x >> 4;
    // 因为两位表示一位,需要乘2
    size_t num = x % 16 * 2;
    if (value == 0)//设置为00
    {
        // 先将3左移到要设置的位,然后取反,保证在这两位为0,
        // 然后&,这两位为0,其他为不变
        tbs->bts[index] &= ~(3 << num);
    }
    // 要设置为01
    else if (value == 1)
    {
   		// 设置1 
        tbs->bts[index] |= (1 << num);
        tbs->bts[index] &= ~(1 << (num + 1));
    }
    // 要设置为10
    else if (value == 2)
    {
    	// 设置1
        tbs->bts[index] |= (1 << (num + 1));
        // 设置0
        tbs->bts[index] &= ~(1 << num);
    }
    // 要设置为11
    else if (value == 3)
    {
        tbs->bts[index] |= (3 << num);
    }       
}

// 销毁
void BTSDestory(TwoBitSet *tbs)
{
    assert(tbs);
    free(tbs->bts);
    tbs->bts = NULL;
    tbs->range = 0;
}

2. Dar dos archivos, hay 10 mil millones de números enteros, sólo tenemos 1Gla memoria, cómo encontrar la intersección de los dos documentos?

  • Como un problema: un archivo 512M, el archivo de Adatos se producirá una vez que el bit se pone a 1 en la figura 1,. Una vez más sin proporcionar
  • Archivos Baparecen los datos una vez en el mapa de bits 2 se pone a 1, de nuevo sin proporcionar (un entero de 32 bits, la memoria de datos 32), entonces el bit 1 &el bit 2, &el resultado es de dos bits es 1 la intersección del archivo.

  • Cuando se administra la memoria y luego pequeña, por ejemplo, sólo a 512Mla memoria, entonces tenemos que presentar este archivo segmentación. operación específica es: configuración / es regla hash, el archivo grande en archivos de corte más pequeño, los mismos números en el mismo tipo aparecen en el mismo pequeño archivo de mapa hash. A continuación, por separado para cada archivo pequeño para encontrar la intersección. La segmentación del archivo principal de la investigación.

3. La deformación de mapa de bits: un archivo tiene 10 mil millones int, 1Gla memoria, los algoritmos de diseño para encontrar todas las ocurrencias del número entero no más de 2 veces

  • El problema con la solución del problema Solución 1. Dos mapas de bits de rendimiento de dos a cuatro casos en los que aparecen 00 0, 1 apareció 01 veces, 10 aparece dos veces, 11 aparecen dos veces o más. 01, 10, escanear ambos casos es posible resolver el problema.

2. Las solicitudes de filtro Bloom

1. a dos documentos, había 10 mil millones query, sólo tenemos 1Gmemoria, cómo encontrar la intersección de los dos documentos? Y los algoritmos se dan algoritmo de aproximación precisa

  • aplicación precisa del mapa de bits de referencia algoritmo para 2
  • algoritmo aproximada se emplea para filtrar Bloom, todos los contenidos del primer archivo en el filtro Bloom, y luego buscar si hay todos los archivos de contenido en el segundo filtro Bloom. En comparación con una intersección aproximado de algoritmo.

2. cómo extender el filtro de floración para eliminar los elementos que soporta operaciones

  • necesidades filtro Bloom sean transformación simple, una transformación de cada contador, que se utiliza una vez a la posición de la operación ya no se lleva a cabo está definida, pero el contador ++, cuando los datos de eliminación ya no está ajustado a 0, y el contador es --, cuando la posición es 0, no existe los datos. Pero el contador en el final la cantidad que se establece? Esto se obtiene teniendo en cuenta el tamaño de los datos, si el conjunto inttendrá 32para indicar la presencia o ausencia de datos, pero esta ventaja perdió completamente filtro Bloom. Si está definida charesto será muy propensos a contar envoltura, ya que sólo puede guardar 256 tipos de circunstancias.

3. hash del corte

1. exceder un 100Gtamaño log file, logen la memoria IPde direcciones, el algoritmo de diseño para encontrar el mayor número de ocurrencias IPdirección? En el mismo sujeto a las condiciones, cómo encontrar el IP de la parte superior de K? ¿Cómo lograr el uso directo de los comandos del sistema Linux?

  • IPLa dirección es un punto decimal, unsigned_intla forma más fácil es dirigir tipo brutal, juego 4Gde memoria para todas las IPdirecciones de marca, que es conseguir 4G * 4 = 16Gun espacio para el procesamiento. En el servidor 16Gno es una cosa difícil. Pero la eficiencia es muy baja.
  • Cortar a través de hash, se proporciona la función de hash, la división de archivos, los mismos datos por la misma función hash almacenado en el mismo archivo afirmativa pequeña. Para conocer una IPdirección es un número entero de 4 bytes, 2 bytes podemos tener 2^16posibilidades, dividido en 65.536 barriles, entonces habrá 65.536 tipo de posibilidades 65.536 barriles, esta posibilidad de la antigua 2 bytes. A continuación, puede mirar en el 65536 barril a su mayor número de ocurrencias del barril IP, y luego volver a ordenar ellos, se puede obtener el primer lugar. Del mismo modo conseguirTOP K

  • LinuxEn primer lugar, el uso de sortpedidos de instrucciones log_file, por lo que se puede obtener un orden ascendente, el mismo caso IPestará adyacente. Luego, utilizando uniqlas instrucciones necesarias para volver a aquí uniq -cserá el número de filas combinadas directamente en frente de la pantalla, a continuación, utilizar sort -nrdonde sort -nse ordenar los números, es decir, el tamaño de la orden número de línea fusionada. sort -nrEsa fusión se sometió a los números en orden descendente. Entonces uso head - Kse puede obtener antes de Kla repetición IP. Integrada es:sort log_file | uniq -c | sort -nr | head -k

4. El índice invertido

1. a miles de archivos, cada tamaño de archivo 1K—100M. Para npalabras, el diseño de los hallazgos algoritmo de todos los archivos que contienen cada palabra de ella, sólo tiene 100Kmemoria

  • Fácil de entender índice invertido: encontrar la palabra correspondiente en el documento, es el índice de secuencia positiva. Así que tomé la npalabra para buscar el archivo correspondiente es un índice invertido. Todos los archivos se analizan, si la palabra aparece en un documento, a continuación, en el siguiente número de archivo se puede grabar en el final de una palabra. De esta manera todos los archivos escaneados serán capaces de resolver este problema. En cuanto a 100Mla única archivo de 100Kla memoria, sólo la suficiente archivo de corte.

5. añadió subsiguiente

Trie树 Eso es más que el árbol de hash, trie, trie prefijo de árbol para la recuperación rápida de un gran número de cuerdas.

lista, tablas de salto, tablas de saltos y otros temas relacionados con los datos masivos saltar.

Publicados 359 artículos originales · ganado elogios 259 · Vistas a 70000 +

Supongo que te gusta

Origin blog.csdn.net/yl_puyu/article/details/104890604
Recomendado
Clasificación