方法一:Hash 法 通过对 url 求 Hash 值,把 Hash 值相同的 url 放到一个单独的文件里,这样就可以把 50亿个url 分解成数量较小的 url,然后一次读入内存进行处理,具体实现思路如下: 首先遍历文件a,对每个ul求Hash 值并散列到1000个文件中,求解方法为h=hash(url)%1000,然后根据 Hash 的结果把这些 url 存放到...
分析:50亿个url,每个url 64字节: 一共需要 50亿 × 64字节 ÷ 1024 ÷ 1024 ÷ 1024 = 298G ≈ 300G ,显然无法一次读入内存的。因此这里采用将大文件切割的分治法。 假设将每个大文件分割为1000个小文件,那么每个小文件大小为:300G ÷ 1000 × 1024 = 307M ≈ 300M,所以同时加载两个文件则需要 300M...
而我们拥有的内存可容纳bit位个数:4G * 8bit = 32G bit = 320亿,按此实现错误率大于0.01。 方法2: 分别扫描A,B两个文件,根据hash(url)%k(k为正整数,比如k = 1000,那么每个小文件只占用300M,内存完全可以放得下)将url划分到不同的k个文件中,比如a0,a1,...a999;b0,b1,...b999; 这样处理后相同...
可以估计每个文件的大小为5G*64=300G,远大于4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。 遍历文件a,对每个url求取hash(url)%1000,然后根据所得值将url分别存储到1000个小文件(设为a0,a1,...a999)当中。这样每个小文件的大小约为300M。遍历文件b,采取和a相同的方法将url分别存储到10...
方案2:如果允许有一定的错误率,可以使用Bloom filter,4G内存大概可以表示340亿bit。将其中一个文件中的url使用Bloom filter映射为这340亿bit,然后挨个读取另外一个文件的url,检查是否与Bloom filter,如果是,那么该url应该是共同的url(注意会有一定的错误率)。
将其中一个文件中的url使用Bloom filter映射为这340亿bit,然后挨个读取另外一个文件的url,检查是否与...
假如每个url大小为10bytes,那么可以估计每个文件的大小为50G×64=320G,远远大于内存限制的4G,所以不可能将其完全加载到内存中处理,可以采用分治的思想来解决。 Step1:遍历文件a,对每个url求取hash(url)%1000,然后根据所取得的值将url分别存储到1000个小文件(记为a0,a1,...,a999,每个小文件约300M); ...
1.创建一个布隆过滤器2.把A文件写入到布隆过滤中3.遍历B文件URL,判断是否在布隆过滤器中 ...
将文件a通过散列映射分为若干个小文件,如1000个,则文件为a0,a1...a999。
1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url? 方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。 s 遍历文件a,对每个url求取 ...