大文件处理

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个文件中的第一个元素,取最小值,写入bufferbuffer 满后写入文件。

Last updated