Bitmap pour un traitement massif de données

 Burning Cup parle du Big Data 

image

I. Aperçu

Cet article décrit les principes pertinents de l'algorithme Bit-Map et certains des scénarios d'utilisation de l'algorithme Bit-Map. Par exemple, BitMap résout les problèmes de détection de duplication de données massives et de jugement de la présence d'éléments individuels dans les données massives. Enfin, les caractéristiques de BitMap ont été introduites dans différents scénarios.

Deux, algorithme Bit-Map

Examinons d'abord un tel scénario: pour un PC ordinaire avec mémoire 2G, il est nécessaire de traiter 4 milliards d'entiers non signés qui ne sont pas répétés et ne sont pas triés. Donnez un entier et demandez si vous pouvez juger rapidement cet entier Cela fait-il partie des 4 milliards de données du fichier?

Pensée aux questions:

4 milliards d'ints représentent (4 milliards * 4) / 1024/1024/1024, soit environ 14,9G. Évidemment, la mémoire n'est que 2G, ce qui ne peut pas tenir. Par conséquent, il est impossible de mettre ces 4 milliards de données dans la mémoire pour le calcul. La meilleure solution pour résoudre ce problème rapidement est de stocker les données en mémoire, donc le problème est maintenant de savoir comment stocker 4 milliards d'entiers dans 2G d'espace mémoire. Un entier entier occupe 4 octets en Java, c'est-à-dire 32 bits. Si un bit peut être utilisé pour identifier un entier int, l'espace de stockage sera considérablement réduit. Calculez l'espace mémoire requis pour 4 milliards d'ints comme 4 milliards / 8 / 1024/1024 fait environ 476,83 Mo, nous pouvons donc mettre ces 4 milliards de nombres int dans la mémoire pour traitement.

Idées spécifiques:

1 int occupe 4 octets, c'est-à-dire 4 * 8 = 32 bits, il suffit alors de demander un tableau int avec une longueur de int tmp [1 + N / 32] pour stocker ces données, où N représente le nombre total Chaque élément de tmp contient 32 bits qui peuvent correspondre au nombre décimal 0 ~ 31, donc la table BitMap peut être obtenue:

tmp [0]: peut représenter 0 ~ 31

tmp [1]: peut représenter 32 ~ 63

tmp [2] peut représenter 64 ~ 95

.......

Voyons ensuite comment le nombre décimal est converti en position de bit correspondante:

En supposant que les 4 milliards de données int sont: 6,3,8,32,36, ..., alors le BitMap spécifique est exprimé comme suit:

image

Comment déterminer quel indice du nombre entier est dans le tableau tmp, cela peut en fait être obtenu en divisant directement par 32 pour obtenir la partie entière, par exemple: l'entier 8 divisé par 32 est arrondi à 0, puis 8 est sur tmp [0]. De plus, comment savoir lequel des 32 bits de 8 est dans tmp [0]? Dans ce cas, directement le mod 32 est ok, et comme l'entier 8, 32 est égal au 8e mod de tmp [0] 8 , alors l'entier 8 est dans le huitième bit de tmp [0] (en partant de la droite).

Une implémentation en java est bitset, un outil qui existe depuis longtemps. Pour une utilisation spécifique, vous pouvez vous référer au code source suivant:

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));
       }
   }

}

Bien sûr, c'est l'utilisation du ready-made, c'est très simple à écrire par soi-même, il y a une implémentation simple ci-dessous:

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

    (index) { 
        = [() ((index -) >>)] = ( ) ((index -) &) >> &} 


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


Je suppose que tu aimes

Origine blog.51cto.com/15127544/2665518
conseillé
Classement