海量数据的处理方案

1. 给定一个大小超过 100G 的文件, 其中存在 IP 地址, 找到其中出现次数最多的 IP地址,

1.内存足够,我们先计算一下所需的内存, 100G 约是 2 37 字节,一个IPV4地址 恰好是一个拥有4个字节的整型, 2 37 / 4 约是32GB
如果我们要用传统的方法排序查找,时间效率是 o ( n 2 ) ,而且需要32GB的内存.
如果降低时间复杂度? 如果一个ip地址出现次数最多,将其排序后,ip地址肯定在中间位置,或者说 其左区间都<=它, 右区间的数都 >= 它,例如:

{1,2,2,2,3}, {1,1,2,2,2,3} 这两情况 出现次数最多的就是2,都在数组中间的位置

那么我们就可以使用快排的partition方法,每次切分后,看返回元素的下标是不是处于中间,在中间的左边,就往右边继续切分,在中间的右边,就往左边继续切分,直到返回的元素下表是mid. 这种方法时间复杂度是 o ( n ) , 数学推导过程自行搜索,我是数学渣…

2.内存不够的情况下,例如我们主机可供其使用的内存只有2GB,但是可以使用多台主机,可以考虑将100G的文件平均划分到这些电脑中去.然后每台电脑使用上述方法进行划分.
但是问题是如何平均的将文件划分. 如果不进行约束,一个IP地址可能会被划分到多台电脑中去,那么统计就失去了意义,

进行约束的方法是使用哈希函数进行映射,我们将每个IP地址作为key进行哈希转换,

对于同一份key,它的哈希值是唯一的, 那么可以保证ip地址相同,肯定会分配到到同一主机中去.
虽然对于不同的key,可同哈希值会一样,但也是将不同的ip映射到统一主机中去,不影响的.

给定100亿个整数, 找到其中只出现一次的整数

100亿个正数,如果一个整数需要4个字节,400亿个字节,如果用两个比特位来表示,只需要 400亿 / 16 = 25亿个字节,也就是1GB内存多一点

其中第一个比特位设置为x,第二个比特位设置为y 使用位图进行存储,
x表示该数是否存在,若x为1, y 为0 表示该数出现了一次,
若再次插入发现x为1,则将y加1,表示该数不止出现了一次,
若再次插入发现x为1,y为1,直接将该数丢弃
最后遍历位图,找出 x为1,y为0的数即可

有两个文件, 分别有100亿个query(查询词, 字符串), 只有1G内存, 找到两个文件的交集

  1. 把两个文件中的query使用哈希划分到若干台主机中,等于划分成N个小文件,并且标明每个文件的来源,然后将来源相等的文件汇总,就是两个文件的交集

  2. 布隆过滤器, 将一个文件使用布隆过滤器插入,另一个使用布隆过滤器进行查找,虽然节省了空间,但是有概率出现误差( 如果查获早失败肯定说明没有,如果查找成功不一定存在),取决于选取的多个哈希函数同时冲突的概率

给上千个文件, 每个文件大小为1K - 100M, 设计算法找到某个词存在在哪些文件中).

使用布隆过滤器,一千个文件,一千个布隆过滤器,将每个文件的词都映射到布隆过滤器中,
然后用某个词去在布隆过滤器中查找,如果存在,就保存文件的ID.
或者使用倒排索引,建立词与文件的映射关系,详细内容参考下面这篇博客:
https://www.cnblogs.com/zlslch/p/6440114.html

布隆过滤器如何支持删除操作和计数

布隆过滤器其实就是位图的扩展,如果要支持删除操作,就要用跟多的比特位来计数
例如原本只需要一个bit位 来保存 0 和 1 表示是否存在, 现在使用3个bit位,
剩下的2个bit位用来计数

猜你喜欢

转载自blog.csdn.net/kwinway/article/details/80475164