bitmap 在海量数据处理中的使用

1,在处理海量数据的时候,必须要高效利用内存空间,否则内存不可能存下这么多数据。如果我只想记录某个数据的存在性,可以利用bitmap原理,把每个数据映射为一个bit。1表示存在,0把表示不存在。


2,bitmap原理:

涉及到的变量

bitmap:一个char型数组,用于存储信息。

index:bitmap中的一个位置

size:bitmap中能存储的数据个数。

base:计划存储数据的最小值。base和size存在的意义是为了让处理数据限定在一个范围内,而不是int类型的整个范围,从而控制bitmap的大小。

data:所处理的一个数据,数据的范围在base~base+size。


[cpp]  view plain copy
  1. #include <iostream>  
  2. #include <cstdio>  
  3. #include <cstring>  
  4. using namespace std;  
  5.   
  6. char *g_bitmap = NULL;  
  7. char g_size=0;  
  8. char g_base=0;  
  9.   
  10. //Build a bitmap with base and size  
  11. //the data should in [base~base+size]  
  12. int bitmap_init(int size, int start)  
  13. {  
  14.     g_size = size/8 + 1;  
  15.     g_base = start;  
  16.     g_bitmap = new char[g_size];  
  17.     if(NULL == g_bitmap)  
  18.         return 0;  
  19.     memset(g_bitmap, 0x0, g_size);  
  20.     return 1;  
  21. }  
  22.   
  23. //translate data to mark  
  24. //1 means 1, 0 means 0, -1 means error.  
  25. int bitmap_get(int data)  
  26. {  
  27.     int q = (data-g_base)/8;  
  28.     int r = (data-g_base)%8;  
  29.     unsigned char x = (0x1<<r);  
  30.       
  31.     if(q > g_size)  
  32.         return -1;  
  33.     unsigned char res = (g_bitmap[q] & x);  
  34.     return res>0?1:0;  
  35. }  
  36.   
  37.   
  38. //mark data to 1  
  39. int bitmap_set(int data)  
  40. {  
  41.     int q = (data-g_base)/8;  
  42.     int r = (data-g_base)%8;  
  43.     unsigned char x = (0x1<<r);  
  44.       
  45.     if(q > g_size)  
  46.         return -1;  
  47.     g_bitmap[q] |= x;  
  48.     return 1;  
  49. }  
  50.   
  51. int bitmap_free()  
  52. {  
  53.     delete[] g_bitmap;  
  54.     g_bitmap=NULL;  
  55.     return 0;  
  56. }  
  57.   
  58. int main()  
  59. {  
  60.     const int N=100;  
  61.     int a[]={5,8,7,6,78};  
  62.     int i;  
  63.     bitmap_init(N,0);  
  64.     for(i=0;i<5;i++)  
  65.         bitmap_set(a[i]);  
  66.   
  67.     for(i=0;i<N;i++)  
  68.         if(bitmap_get(i))  
  69.             cout<<i<<" ";  
  70.     cout<<endl;  
  71.   
  72.     bitmap_free();  
  73.     return 1;  
  74. }  

你可能感兴趣的:(bitmap 在海量数据处理中的使用)