Java 海量数据处理方法总结

Java 程序员面试宝典 笔记

  • Hash 法
  • Bit-map 法
  • Bloom filter 法
  • 数据库优化法
  • 倒排索引法
  • 外排序法
  • Trie 树
  • 双层桶法
  • MapReduce 法

Hash 法

散列

  • hash 函数尽可能简单
  • 函数的值域必须在散列表的范围内
  • 尽可能减少冲突

Bit-map 法

位图 法的基本原理是使用位数组成来表示某些元素是否存在. 本方法适用于海量数据的快速查找/判重/删除等等.
与其说是算法, 不如说是一种紧凑的数据结构.

Bloom filter 法 (重点)

引入了 K (K>1)个相互独立的哈希函数, 保证在给定的空间, 误判率下, 完成元素判定重复的过程. 图是 k = 3 时的 bloom filter.

bloom filter k = 3

x, y, z 经由哈希函数映射将各自在 bitmap 中的三个位置置为 1, 当 w 出现时,仅当 3 个标志位都为 1 时, 才表示 w 在集合中. 图中的情况会判定为 w 不在集合中.

bloom filter 的误差

假设所有哈希函数散列足够均匀, 散列后落到 bitmap 每个位置的 概率均等. bitmap 的大小为 m, 原始数集大小为 n, 哈希函数个数为 k:

  1. 1 个散列函数时, 接受一个元素时 bitmap 中某一位置为 0 的概率为:
    1 - 1/m

  2. k 个相互独立的散列函数, 接受一个元素时 bitmap 中某一位置为 0 的概率为:
    (1 - 1/m)^2

  3. 假设原始集合中, 所有元素都不相等 (最严格的情况), 讲所有元素都输入 bloom filter, 此时某一位置仍为 0 的概率为:
    ( 1 - 1/m ) ^ {nk}
    某一位置为 1 的概率为
    1-(1-1/m)^{nk}

  4. 当我们对某个元素进行判重时, 误判即这个元素对应的 k 个标志位不全为 1, 但所有 k 个标志位都被置为 1, 误判率 \epsilon 约为:
    \epsilon \approx [1-(1-1/m)^{nk} ]^k
    这个误判率比实际比值大, 因为讲判断正确的情况也算进去了. 根据极限 {\lim_{n \to \infty}}(1+1/n)^n = e 可以得到:
    \epsilon \approx [1-e^{-{nk}/m} ]^k
    \epsilon得到最优解,当且仅当
    k={m/n}In2 \approx 0.7* {m/n}
    此时, 误判率 \epsilon 与数集大小和
    \epsilon \approx (1-e^{-In2})^{-In2* m/n}=0.5^{In2*m/n} = 0.5^k

同时, 由于硬盘空间时限制死的, 集合元素个数 n 的大小反而与单个数据的比特数成反比, 数据长度为 64 bit 时,
n= 5TB/64bit = 5 * 2^{40} Byte / 8 Byte \approx 2^{34}

若以 m = 16n 计算, bitmap 集合的大小为
2^{38}Bit = 2^{35} Byte = 32 GB, 此时的 \epsilon \approx 0.0005, 这是误差的上限.

bloom filter 通过引入一定的错误率, 使得海量数据判重在可以接受的内存代价中得以实现, 从上述公式可以看出, 随着集合中的元素不断输入过滤器中(n增大), 误差将越来越大. 但是, 当 bitmap 的大小 m (指 bit 数)足够大时, 比如比 所有可能出现的不重复元素个数 还要大 10 倍以上时, 错误概率时可以接受的.

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
import java.util.HashSet;
import java.util.Random;

public class testBloomFilter {

    static int sizeOfNumberSet = Integer.MAX_VALUE >> 4;

    static Random generator = new Random();

    public static void main(String[] args) {

        int error = 0;
        HashSet<Integer> hashSet = new HashSet<Integer>();
        BloomFilter<Integer> filter = BloomFilter.create(Funnels.integerFunnel(), sizeOfNumberSet);

        for(int i = 0; i < sizeOfNumberSet; i++) {
            int number = generator.nextInt();
            if(filter.mightContain(number) != hashSet.contains(number)) {
                error++;
            }
            filter.put(number);
            hashSet.add(number);
        }

        System.out.println("Error count: " + error + ", error rate = " + String.format("%f", (float)error/(float)sizeOfNumberSet));
    }
}

参考: https://blog.csdn.net/zdxiq000/article/details/57626464

数据库优化法

通过选择合适的数据库系统来优化数据处理

倒排索引法

外排序法

Trie 法

双层桶法

MapReduce 法

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容