问题:数据太大,在内存中无法一次性装入。

题1:给定一个大小超过100亿的文件,该文件是用来存储IP地址,找到出现次数最多的IP地址。
分析:100亿就是大约就是10G,对于现在的计算机而言,内存中无法容纳这么大的文件。
解决:将一个大文件切分为多个小文件,例如:我们可以将该100亿的大文件切分为1000个文件,即每个文件的大小大约就是10M,那么就可以在内存中容纳得下了。
那么,我们要怎么来切分这个100亿的大文件呢?平均分?很显然是不可以的,如果分到某个文件的IP地址出现的次数都是1次,那么该文件出现最多的IP就是这10M个IP。那么就会浪费很大的空间,不符合我们的预期。所以,在此我们可以采用哈希表的方式,对IP先转换为对应的整数,在对该数取模,将模相同的IP放在同一个文件之中,那么这样在同一个文件中出现IP相同的概率就会大一些。
然后我们就可以分别统计出这1000个文件中IP次数最多的IP,然后再将这1000个文件进行汇总。如下面的图解。

对于大数据的一些处理方法

题2:给定100亿个整数,找到其中只出现一次的整数。
分析:遇到这样的问题,我们首先想到的处理方法就是:使用一个辅助数组,用来存储每个数据出现的次数。那么我们就需要100亿大小的数组。100亿 = 10G = 10 * 4 = 40G,可能就需要40G的内存,明显对于当代的计算机是不可能的。
解决:我们需要的结果是找出出现一次的数字,我们知道,位图可以用来表示一个数字是否存在,可是我们现在要找的数字是出现一次的数字。所以,我们可以将之前的位图进行扩展。例如:我们使用两位来表示一个数字的存在状态。00:表示该数字不存在;01:表示该数字存在1次;11:表示该数字出现了多次。那么,这样100亿个数字就只要200亿个位,即需要25亿字节,即需要2.5个G就可以进行统计了。在查找的过程中,我们只需要判断是否是01,如果是那么就是我们要找的那个数字。


题3:有两个文件,分别由100亿个query(查询词,即字符串),但是只有1G的内存,找到两个文件的交集。
分析:对于这样的 大文件,同样的我们不能对其进行处理。因为在当代的计算机中并不能存储这么大的数据。
解决:与问题一相似,首先将这两个大文件进行切分。切分完后,就产生了很多小文件,文件1:file1.1,file1.2,file1.3,file1.4,file1.5,…….文件2:file2.1,file2.2,file2.3,file2.4,file2.5,…….然后我们将file1中的所有小文件采用布隆过滤器存储,然后再处理文件2的小文件,在处理文件2的小文件时,若file1中也存在该文件,我们就把它存储于另外一个文件中。当文件2的所有小文件处理完时,也就找到了两个文件的交集。


题4:给定上千个文件,每个文件的大小为1K-100M,请设计算法找到某个词存在于哪些文件之中。
解决:首先我们了解一下什么是正排索引,什么是倒排索引。
简单的说,正排索引就是根据编号去找对应的数据;而倒排索引就是根据数据去找编号。详解如下图所示:
对于大数据的一些处理方法
对于大数据的一些处理方法
那么,显而易见,对于这个问题我们就要使用倒排索引的方式:
解决过程:

  1. 首先将每个文件的数据对应的存储到一个布隆过滤器之中,可能会存在很多个布隆过滤器。
  2. 然后我们读取每一个布隆过滤器中的词,并且记录每个词和其对应的文件,将其保存在另外一个文件中,假设这个文件叫做Information。(即倒排索引的方式存储)
  3. 将所有的词分为几个小部分,分别存储到布隆过滤器中。
  4. 当遇到一个词后,我们就要判断该词是否存在。那么,此时我们就可以在存储单词的布隆过滤器中查找,判断该词是否存在。
    a.遍历所有存储单词的布隆过滤器,如果存在,也就可以找到其对应的文件了。若不存在,那么该单词不在这些文件之中。

总结:对于大数的处理方法:

  1. 切分
  2. 使用哈希,位图,布隆过滤器等算法。。。。。。。
    对于大数据的一些处理方法

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-02-27
  • 2021-12-14
  • 2021-09-09
  • 2021-07-16
  • 2023-01-03
  • 2021-10-12
猜你喜欢
  • 2021-12-16
  • 2022-12-23
  • 2021-04-18
  • 2022-12-23
  • 2021-11-28
相关资源
相似解决方案