大文件处理
10G
内存,500G
数据,怎么排序
IP 四段共有 40 亿个 IP,给个 access.log,怎么统计其中出现次数 Top10 的 IP
bitmap / 布隆过滤器
如果是整数且去重后数组较少,可以直接用计数 bitmap
做,如果数据过于稀疏,可以做一次哈希,哈希到更小的范围(布隆过滤器的做法
分治
大部分需求可以通过分割成小文件分别处理、最后合并的思路来解决
1. 分批处理
内存中维护一个极小的核心缓冲区 memBuffer
,将大文件按行读入,搜集到 memBuffer
满或者大文件读完时,对 memBuffer
中的数据调用内排进行排序,排序后将有序结果写入磁盘文件 bigdata.xxx.part.sorted
循环利用 memBuffer
直到大文件处理完毕,得到 50个有序的磁盘文件。
像 IP 这种数据,可按照四段的第一段进行路由分片,分为255个片,每片一个小文件,把每片的计数写在对应的小文件里,最后遍历所有小文件统计 Top 10
2. 合并
每次读取 50个文件中的第一个元素,取最小值,写入buffer
。buffer
满后写入文件。
Last updated