Directorio artículo
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
int
variedad de todos los datos, a saber4G
los datos, sólo tenemos4G / 8 = 512M
espacio 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
512M
mapas de bits, por lo que extra de1G
espacio
- Segundo método
- Este problema también se puede utilizar un gran mapa de bits que debe resolverse antes de que el
512M
rendimiento de mapa de bits deint
todos 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 es1G
el 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 1G
la memoria, cómo encontrar la intersección de los dos documentos?
- Como un problema: un archivo
512M
, el archivo deA
datos se producirá una vez que el bit se pone a 1 en la figura 1,. Una vez más sin proporcionar - Archivos
B
aparecen 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
512M
la 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
, 1G
la 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 1G
memoria, 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 conjuntoint
tendrá32
para indicar la presencia o ausencia de datos, pero esta ventaja perdió completamente filtro Bloom. Si está definidachar
esto será muy propensos a contar envoltura, ya que sólo puede guardar 256 tipos de circunstancias.
3. hash del corte
1. exceder un 100G
tamaño log file
, log
en la memoria IP
de direcciones, el algoritmo de diseño para encontrar el mayor número de ocurrencias IP
direcció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?
IP
La dirección es un punto decimal,unsigned_int
la forma más fácil es dirigir tipo brutal, juego4G
de memoria para todas lasIP
direcciones de marca, que es conseguir4G * 4 = 16G
un espacio para el procesamiento. En el servidor16G
no 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
IP
dirección es un número entero de 4 bytes, 2 bytes podemos tener2^16
posibilidades, 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 barrilIP
, y luego volver a ordenar ellos, se puede obtener el primer lugar. Del mismo modo conseguirTOP K
Linux
En primer lugar, el uso desort
pedidos de instruccioneslog_file
, por lo que se puede obtener un orden ascendente, el mismo casoIP
estará adyacente. Luego, utilizandouniq
las instrucciones necesarias para volver a aquíuniq -c
será el número de filas combinadas directamente en frente de la pantalla, a continuación, utilizarsort -nr
dondesort -n
se ordenar los números, es decir, el tamaño de la orden número de línea fusionada.sort -nr
Esa fusión se sometió a los números en orden descendente. Entonces usohead - K
se puede obtener antes deK
la repeticiónIP
. 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 n
palabras, el diseño de los hallazgos algoritmo de todos los archivos que contienen cada palabra de ella, sólo tiene 100K
memoria
- Fácil de entender índice invertido: encontrar la palabra correspondiente en el documento, es el índice de secuencia positiva. Así que tomé la
n
palabra 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 a100M
la única archivo de100K
la 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.