面试高频题:海量数据中找到具有某个特征的数字
题目描述:有一个1G大小的文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M,要求返回频数最高的100个词
思路:
这类面试题有个非常统一的特点,要处理的文件非常大而内存非常小,基本都需要用到归并思想,但是如何归并要视场景的不同而变化
在分而治之的背景下,统计词频首先需要解决“同步”和“通信”问题,或者是使用某种预处理能够避免不同子问题之间有交叉。一种想法是将不同数据映射到不同子文件中,在保证子文件足够小的情况下,确保相同的数字能够在一个子文件中,就能在子问题中解决词频的统计。最后排序在归并过程中解决。1G的文件、1M的内存,使用5000个子文件即可(5000 * 200K约等于1G,平均每个子文件只需占用200K内存)。
在划分子文件时有个技巧,一次读取整个文件是不可能的,需要设定一个文件指针,一次读取一个词,计算Hash值后立即写入相应子文件中,然后移动指针,重复相应操作。这个过程并不需要太多的内存消耗(使用的空间几乎为常数)
题目要求返回频数最高的100词,那我们就可以在子文件中先统计词频最高的100个词,减少搜索的范围(这个过程可以用堆来完成)。保存成新的5000个子文件
最后我们对5000个子文件进行归并处理:每比较出一个较大词频的词,写入到文件中(读的时候是一个文件一次读一个词,每得到一个结果就立即写入,这样占用的内存就很小了),统计到100后终止。这一每次次归并就能将文件数减半,每个子文件包含最大的100个词频。
参考资料:
[1]: https://blog.csdn.net/Fly_as_tadpole/article/details/88375993
面试高频题:海量数据中找到具有某个特征的数字
https://www.torch-fan.site/2023/04/03/面试高频题-海量数据中找到具有某个特征的数字/