1.题目描述
给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?

2.思考过程
(1)首先我们最常想到的方法是读取文件a,建立哈希表(为什么要建立hash表?因为方便后面的查找),然后再读取文件b,遍历文件b中每个url,对于每个遍历,我们都执行查找hash表的操作,若hash表中搜索到了,则说明两文件共有,存入一个集合。

(2)但上述方法有一个明显问题,加载一个文件的数据需要50亿*64bytes = 320G远远大于4G内存,何况我们还需要分配哈希表数据结构所使用的空间,所以不可能一次性把文件中所有数据构建一个整体的hash表。


(3)针对上述问题,我们分治算法的思想。

step1:遍历文件a,对每个url求取hash(url)%1000,然后根据所取得的值将url分别存储到1000个小文件(记为a0,a1,...,a999,每个小文件约300M),为什么是1000?主要根据内存大小和要分治的文件大小来计算,我们就大致可以把320G大小分为1000份,每份大约300M(当然,到底能不能分布尽量均匀,得看hash函数的设计)

step2:遍历文件b,采取和a相同的方式将url分别存储到1000个小文件(记为b0,b1,...,b999)(为什么要这样做? 文件a的hash映射和文件b的hash映射函数要保持一致,这样的话相同的url就会保存在对应的小文件中,比如,如果a中有一个url记录data1被hash到了a99文件中,那么如果b中也有相同url,则一定被hash到了b99中)

所以现在问题转换成了:找出1000对小文件中每一对相同的url(不对应的小文件不可能有相同的url)

step3:因为每个hash大约300M,所以我们再可以采用(1)中的想法


所以海量数据面前要多采用分治算法,化整为零 各个击破!

海量数据处理:两个大文件中的相同记录相关推荐

  1. 海量数据处理面试题/大文件问题

    首先引用原博主的一句话,感触颇深 面试时,70~80%的人不是倒在这两方面,而是倒在基础之上(诸如语言,数据库,操作系统,网络协议等等),所以,无论任何时候,基础最重要,没了基础,便什么都不是. 不要 ...

  2. 【linux】使用sed删除大文件中的指定行

    [linux]使用sed删除大文件中的指定行 引言: 最近在清洗数据时遇到一个超大的文件,需要删除其中不符合数据要求的指定行.使用之前写好的python脚本清洗速度太慢,于是检索了许多linux文件处 ...

  3. 使用python依次比较两个pcap文件中的每个报文

    #coding=UTF-8 #author="刘一凡" #date=20190826 ''' 程序功能 依次比较两个pcap文件中的每个报文.如果报文不同,则输出不相同的字节的偏移 ...

  4. vim 在两个不同文件中复制与粘贴(简单,详细)

    vim 在两个不同文件中复制与粘贴 (vim在系统剪切板的复制与粘贴) 假设将 b文件的某内容 复制到 a文件中 普通模式下 :reg 命令 可以查看vim 自己的粘贴板,分别是 ". 0. ...

  5. A.c 和B.c两个c文件中使用了两个相同名字的static变量

    A.c 和B.c两个c文件中使用了两个相同名字的static变量,编译的时候会不会有问题? 在头文件中定义static,然后这个头文件被不同的文件引用.我们知道,static的作用域是定义它的源文件中 ...

  6. 使用Python解决对比出两个Excel文件中的不同项并将结果重新写入一个新的Excel文件

    使用Python解决对比出两个Excel文件中的不同项并将结果重新写入一个新的Excel文件 因为有统计成员到会情况的任务,每次汇总时都很麻烦,需要一个个对应腾讯会议导出名单的成员,然后在总表上进行标 ...

  7. 22. 处理Excel文件-删除在其他文件中存在的记录

    工作和学习中,经常需要对一个Excel文件中的记录进行删除.今天和大家一起学习,如何在一个文件中删除其他文件中存在的记录. 问题:第一个Excel文件存储了学生信息,如"表1"所示 ...

  8. python中删除某一行_python 删除大文件中的某一行(最有效率的方法)

    用 python 处理一个文本时,想要删除其中中某一行,常规的思路是先把文件读入内存,在内存中修改后再写入源文件. 但如果要处理一个很大的文本,比如GB级别的文本时,这种方法不仅需要占用很大内存,而且 ...

  9. python写二进制大文件,如何将文件写入二进制文件,或在大文件中编辑单行– Python...

    我有几个大型XML文件,由于某些无法识别的字符而无法解析,投诉类似于: xml.etree.ElementTree.ParseError: not well-formed (invalid token ...

最新文章

  1. html中有csstext方法吗,style对象的cssText方法有哪些使用方法
  2. mysql创建表语句 引擎、编码和字符集设置
  3. matlab中degrees,Convert degrees-minutes-seconds to degrees
  4. 盲僧一键r闪用什么设置_美加狮R.A.T. PRO X3至尊版带你畅玩模拟飞行
  5. Java常见问题(1)navicat连接mysql报2059错误
  6. Pentium II Pentium III架构/微架构/流水线 (7) - 微架构框图
  7. 1000道Python题库系列分享18(11道选择题)
  8. matplotlib scale 刻度
  9. python的ogr模块_Python与开源GIS:使用OGR模块打开矢量数据
  10. 【英语阅读】经济学人 | 人脸识别不只是另一种技术。它将改变社会
  11. 聚合支付系统设计(一)
  12. word添加脚注后正文跑到下一页
  13. 您未被授权查看该页原来是不瑞星个人防火墙的问题
  14. 电脑鼠标右键应用卡死、转圈圈、资源管理器关闭等问题
  15. matlab实例一之Forward Collision Warning Using Sensor Fusion (视觉和毫米波雷达)
  16. 老卫带你学---DDSM乳腺癌数据研究
  17. 使用python来进行用户流失预测的实战
  18. MySQL数据库基础操作
  19. 技术专栏 | 为什么要基于模型设计?
  20. stm32正常运行流程图_STM32学习笔记(超详细整理144个问题)

热门文章

  1. Android视频播放之VideoView
  2. 极简易版专家聊天程序--JAVA练手
  3. ECSHOP系统纯静态网页的生成
  4. .net事务的困扰,请大虾指点。
  5. 使用ffmpeg对视频进行TS切片
  6. linux 下 gcc o2优化可能出现的问题
  7. PCL点云库用Poisson网格化实现点云的表面重建
  8. 虚函数、纯虚函数、虚函数与析构函数
  9. win10 安装 Pytorch
  10. debian 使用 systemctl 且自启frp