Mapa de bits para procesamiento masivo de datos

 Burning Cup hablando de Big Data 

imagen

I. Panorama general

Este artículo describirá los principios relevantes del algoritmo Bit-Map y algunos de los escenarios de uso del algoritmo Bit-Map. Por ejemplo, BitMap resuelve los problemas de encontrar duplicación de datos masivos y juzgar si los elementos individuales están en los datos masivos. Finalmente, se han introducido las características de BitMap en varios escenarios.

Dos, algoritmo de mapa de bits

Echemos un vistazo a este escenario primero: para una PC ordinaria con memoria 2G, se requiere procesar 4 mil millones de enteros enteros sin signo que no se repiten y no están ordenados. Dé un número entero y pregunte si puede juzgar rápidamente este entero ¿Se encuentra entre los 4 mil millones de datos del archivo?

Pregunta pensando:

4 mil millones de ints representan (4 mil millones * 4) / 1024/1024/1024, que es aproximadamente 14.9G. Obviamente, la memoria es solo 2G, que no puede caber. Por lo tanto, es imposible poner estos 4 mil millones de datos en la memoria para el cálculo. La mejor solución para resolver este problema rápidamente es almacenar los datos en la memoria, por lo que el problema ahora es cómo almacenar 4 mil millones de enteros en 2G de espacio de memoria. Un entero entero ocupa 4 bytes en Java, es decir, 32 bits. Si se puede usar un bit para identificar un entero entero, el espacio de almacenamiento se reducirá considerablemente. Calcule el espacio de memoria requerido para 4 mil millones de ints como 4 mil millones / 8 / 1024/1024 es de aproximadamente 476,83 mb, por lo que podemos poner estos 4 mil millones de números int en la memoria para su procesamiento.

Ideas específicas:

1 int ocupa 4 bytes, es decir, 4 * 8 = 32 bits, entonces solo necesitamos solicitar una matriz int con una longitud de int tmp [1 + N / 32] para almacenar estos datos, donde N representa el número total Cada elemento en tmp contiene 32 bits que pueden corresponder al número decimal 0 ~ 31, por lo que se puede obtener la tabla BitMap:

tmp [0]: puede representar 0 ~ 31

tmp [1]: puede representar 32 ~ 63

tmp [2] puede representar 64 ~ 95

.......

Luego, echemos un vistazo a cómo se convierte el número decimal a la posición de bit correspondiente:

Suponiendo que los 4 mil millones de datos int son: 6,3,8,32,36, ..., entonces el BitMap específico se expresa como:

imagen

Cómo determinar qué subíndice del número int está en la matriz tmp, esto en realidad se puede obtener dividiendo directamente por 32 para obtener la parte entera, por ejemplo: el entero 8 dividido por 32 se redondea a 0, luego 8 está en tmp [0]. Además, ¿cómo sabemos cuál de los 32 bits de 8 está en tmp [0]? En este caso, directamente el mod 32 está bien, y como el entero 8, 32 es igual al octavo mod en tmp [0] 8 , entonces el entero 8 está en el octavo bit de tmp [0] (contando desde la derecha).

Una implementación en java es bitset, una herramienta que existe desde hace mucho tiempo. Para un uso específico, puede consultar el siguiente código fuente:

import java.util.BitSet;

public class BitSetTest {

   public static void main(String[] args{
       int [] array = new int [] {1,2,3,22,0,3,63};
       BitSet bitSet  = new BitSet(1);
       System.out.println(bitSet.size());   //64
       bitSet  = new BitSet(65);
       System.out.println(bitSet.size());   //128
       bitSet  = new BitSet(23);
       System.out.println(bitSet.size());   //64

       //将数组内容组bitmap
       for(int i=0;i<array.length;i++)
       {
           bitSet.set(array[i], true);
       }

       System.out.println(bitSet.get(22));
       System.out.println(bitSet.get(60));

       System.out.println("下面开始遍历BitSet:");
       for ( int i = 0; i < bitSet.size(); i++ ){
           System.out.println(bitSet.get(i));
       }
   }

}

Por supuesto, este es el uso de ready-made, es muy simple de escribir usted mismo, hay una implementación simple a continuación:

{ 
    [] (longitud) { 
        . = longitud = [() (longitud >>) + ((longitud &)>?:)]} 

    (índice) { 
        = [() ((índice -) >>)] = ( ) ((índice -) &) >> &} 


    (índice) { 
        = () ((índice -) >>) = () ((índice -) &) = [] [] = | (<<)} 
    ([] args) { 
        = BitMap (). setBit () .. println (.getBit ()) .. println (.getBit ())} 
}


Supongo que te gusta

Origin blog.51cto.com/15127544/2665518
Recomendado
Clasificación