给定a、b两个文件,各存放50亿个url,每个url各占64B,内存限制4GB,请找出文件a与文件b中共同的url。
由于内存限制为4GB,而每个文件大小为50亿*64B = 5*64GB = 320GB,远远超出了内存限制,因此无法将所有的url读取到内存中,此时可以采取分批读取的方法。
Hash法
通过对url求Hash值,根据Hash值对url进行分类并放到不同的文件里,这样就可以把50亿个url分解成数量较小的url,然后一次性读入到内存中进行处理,具体思路如下:
首先遍历文件a,对每个url求Hash值并散列到1000个文件中,求解方法为 h = hash(url) % 1000,然后根据Hash的结果把这些url存放到文件fa中,通过散列,所有的url将会分布在(fa0,fa1,fa2,...,fa998,fa999)这1000个文件中。每个文件大小约为320MB。同理,遍历文件b,将文件b中的url按照相同的计算方法散列到(fb0,fb1,fb2,...,fb998,fb999)这1000个文件中。显然与fa0中相同的url只可能在fb0中,因此只需要分别找出fai与fbi(0≤i≤999)中相同的url即可。
此外,如果经过Hash法处理后,还有小文件占的内存大小超过4GB,此时可采用相同的办法把文件分割为更小的文件进行处理。
Bloom filter法
待续...