> For the complete documentation index, see [llms.txt](https://wtifs.gitbook.io/diva-notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wtifs.gitbook.io/diva-notes/system-design/da-wen-jian-chu-li.md).

# 大文件处理

`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` 满后写入文件。
