zoukankan      html  css  js  c++  java
  • 如何从大量的 url 中找出相同的 url

    题目描述:

    给定 a、b 两个文件,各存放 50 亿个 url,每个 url 各占 64B,内存限制是 4GB,找出 a、b 两个文件共同的 url。

    分析与解答:

    因为每个 url 需要占 64B,所以 50 亿个 url 占用的空间大小为 50 亿 ×64=5GB×64=320GB。由于内存大小只有 4GB,因此不可能一次性把所有的 url 都加载到内存中处理。对于这个类型的题目,一般都需要使用分治法,即把一个文件中的 url 按照某一特征分成多个文件,使得每个文件的内容都小于 4GB,这样就可以把这个文件一次性读到内存中进行处理了。对于本题而言,主要的实现思路为以下几点。
    1)遍历文件 a,对遍历到的 url 求 hash(url)%500,根据计算结果把遍历到的 url 分别存储到 a0,a1,a2,…,a499(将计算结果为 i 的 url 存储到文件 ai 中),这样每个文件的大小约为 600MB。当某一个文件中 url 的大小超过 2GB 时,可以按照类似的思路把这个文件继续分为更小的子文件(例如,如果 a1 大小超过 2GB,那么可以把文件继续分成 a11, a12, …)。
    2)使用同样的方法遍历文件 b,把文件 b 中的 url 分别存储到文件 b0,b1,…,b499 中。
    3)通过上面的划分,与 ai 中 url 相同的 url 一定在 bi 中。由于 ai 与 bi 中所有的 url 的大小不会超过 4GB,因此可以把它们同时读入到内存中进行处理。具体思路:遍历文件 ai,把遍历到的 url 存入到 hash_set 中,接着遍历文件 bi 中的 url,如果这个 url 在 hash_set 中存在,那么说明这个 url 是这两个文件共同的 url,可以把这个 url 保存到另外一个单独的文件中。当把文件 a0~a499 都遍历完成后,就找到了两个文件共同的 url。

  • 相关阅读:
    关于编程
    Python的内建sort方法

    Elgg设置SMTP验证发送邮件教程
    ThinkPHP 和 UCenter接口的冲突
    mac下终端iTerm2配置
    自动化 Amazon EBS 快照生命周期
    AWS Certified Solutions Architect Associate 学习笔记1
    实例存储生命周期 Instance store
    可触发 Lambda 函数的 CloudFront 事件
  • 原文地址:https://www.cnblogs.com/hardy-wang/p/13072910.html
Copyright © 2011-2022 走看看