如何从大量的 URL 中找出相同的 URL?

作者: Java面试

题目描述

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

解答思路

1. 分治策略

每个 URL 占 64B,那么 50 亿个 URL 占用的空间大小约为 320GB。

5, 000, 000, 000 64B ≈ 5GB 64 = 320GB

由于内存大小只有 4G,因此,我们不可能一次性把所有 URL 加载到内存中处理。对于这种类型的题目,一般采用分治策略,即:把一个文件中的 URL 按照某个特征划分为多个小文件,使得每个小文件大小不超过 4G,这样就可以把这个小文件读到内存中进行处理了。 思路如下

首先遍历文件 a,对遍历到的 URL 求 hash(URL) % 1000 ,根据计算结果把遍历到的 URL 存储到 a0, a1, a2, …, a999,这样每个大小约为 300MB。使用同样的方法遍历文件 b,把文件 b 中的 URL 分别存储到文件 b0, b1, b2, …, b999 中。这样处理过后,所有可能相同的 URL 都在对应的小文件中,即 a0 对应 b0, …, a999 对应 b999,不对应的小文件不可能有相同的 URL。那么接下来,我们只需要求出这 1000 对小文件中相同的 URL 就好了。

接着遍历 ai( i∈[0,999] ),把 URL 存储到一个 HashSet 集合中。然后遍历 bi 中每个 URL,看在 HashSet 集合中是否存在,若存在,说明这就是共同的 URL,可以把这个 URL 保存到一个单独的文件中。

2. 前缀树

一般而言,URL 的长度差距不会不大,而且前面几个字符,绝大部分相同。这种情况下,非常适合使用字典树(trie tree) 这种数据结构来进行存储,降低存储成本的同时,提高查询效率。

@ChunelFeng 反馈。#212

方法总结

分治策略

  1. 分而治之,进行哈希取余;
  2. 对每个子文件进行 HashSet 统计。

前缀树

  1. 利用字符串的公共前缀来降低存储成本,提高查询效率。

更多推荐

更多
  • Docker高级-十五、使用亚马逊 EC2 创建 Amazon EC2 实例,创建密钥对,启动 Amazon EC2 实例,连接到 Amazon EC2 实例,查找公共 IP 地址,查找公共 DNS,添加默认安全组,停止 Amazon EC2 实例,更改实例类型,摘要, 亚马逊网
    Apache CN

  • Docker高级-十三、使用 Apache Solr 设置环境,启动 Apache Solr 服务器的 Docker 容器,启动交互式 Shell,登录 Solr 管理控制台,创建核心索引,加载样本数据,在 Solr 管理控制台中查询 Apache Solr,使用 REST API 客户端
    Apache CN

  • Docker高级-十四、使用 Apache Spark 设置环境,运行 CDH 的 Docker 容器,以纱线集群模式运行 Apache Spark 作业,在 yarnclient 模式下运行 Apache Spark 作业,运行 Apache Spark Shell,摘要,Apache S
    Apache CN

  • Docker高级-十一、使用 Apache Sqoop 设置环境,启动 Docker 容器,启动交互式终端,创建 MySQL 表,将 MySQL JDBC Jar 添加到 Sqoop 类路径,设置 JAVA_HOME 环境变量,配置 Apache Hadoop,用 Sqoop 将 MySQL
    Apache CN

  • Docker高级-十二、使用 ApacheKafka 设置环境,为 Apache Kafka 启动 Docker 容器,查找 IP 地址,列出 Kafka 的日志,创造一个 Kafka 主题,启动 Kafka 制作人,启动 Kafka 消费者,生产和消费消息,停止和移除 Docker 容器
    Apache CN

  • Docker高级-八、使用 Apache Hadoop 设置环境,启动 Hadoop,启动交互式 Shell,为 MapReduce 字数统计应用创建输入文件,运行 MapReduce 字数统计应用,停止 Hadoop Docker 容器,使用 CDH 坞站映像,摘要,Apache Hado
    Apache CN

  • Docker高级-九、使用 Apache Hive 设置环境,正在启动 Apache Hive,连接到直线 CLI 外壳,连接到 HiveServer2,创建配置单元表,将数据加载到配置单元表中,查询配置单元表,停止 Apache 蜂房,摘要,Apache Hive 是用于存储、管理和查
    Apache CN

  • Docker高级-十、使用 Apache HBase 设置环境,从 CDH 开始,启动交互式外壳,启动 HBase Shell,创建 HBase 表,列出 HBase 表,获取单个表格行,获取单行列,扫描表格,阻止 CDH,摘要,Apache HBase 是 Apache Hadoop 数
    Apache CN

  • Docker高级-六、使用 Apache Cassandra 设置环境,启动 Apache Cassandra,启动 TTY,连接到 CQL Shell,创建密钥空间,更改密钥空间,使用密钥空间,创建表格,添加表格数据,查询表,从表格中删除,截断表格,放下一张桌子,删除一个键空间,退出 CQL 壳
    Apache CN

  • Docker高级-七、使用 Couchbase 服务器 设置环境,启动 Couchbase,访问 Couchbase Web 控制台,配置 Couchbase 服务器群集,添加文档,启动交互式终端,运行 Couchbase CLI 工具,停止 Couchbase 服务器和容器,摘要,Couc
    Apache CN

  • 近期文章

    更多
    文章目录

      推荐作者

      更多