检查网页(url)重复
来源:互联网 发布:红外透视镜软件下载 编辑:程序博客网 时间:2024/06/06 10:58
问题:有10亿个url,每个url对应一个非常大的网页,如何检测网页是否重复。
解答:
网页大,数量多,要把它们载入内存是不现实的。 因此我们需要一个更简短的方式来表示这些网页。而hash表正是干这事的。 我们将网页内容做哈希,而不是url,这里不同url可能对应相同的网页内容。
将每个网页转换为一个哈希值后,我们就得到了10亿个哈希值, 很明显,两两对比也是非常耗时的O(n2 )。因此我们需要使用其它高效的方法。
根据以上分析,我们可以推出满足条件的以下算法:
遍历网页,并计算每个网页的哈希值。
检查哈希值是否已经在哈希表中,如果是,说明其网页内容是重复的,输出其url。 否则保存url,并将哈希值插入哈希表。
通过这种方法我们可以得到一组url,其对应的网页内容都是唯一的。但有一个问题, 一台计算机可以完成以上任务吗?
一个网页我们要花费多少存储空间?
每个网页转换成一个4字节的哈希值
假设一个url平均是30个字符,那我们至少需要30个字节
因此对应一个url,我们一共要用掉34个字节
34字节 * 10亿 = 31.6GB。很明显,单机的内存是无法搞定的。
我们要如何解决这个问题?
我们可以将这些数据分成多个文件放在磁盘中,分次载入内存处理。 这样一来我们要解决的就是文件的载入/载出问题。
我们可以通过哈希的方式将数据保存在不同文件,这样一来,大小就不是问题了, 但存取时间就成了问题。硬盘上的哈希表随机读写要耗费较多的时间, 主要花费在寻道及旋转延迟上。关于这个问题, 可以使用电梯调度算法来消除磁头在磁道间的随机移动,以此减少消耗的时间。
我们可以使用多台机器来处理这些数据。这样一来,我们要面对的就是网络延迟。 假如我们有n台机器。
首先,我们对网页做哈希,得到一个哈希值v
v%n 决定这个网页的哈希值会存放在哪台机器
v/n 决定这个哈希值存放在该机器上哈希表的位置
问题:有A,B连个文件,分别存放50亿url,找出A,B中相同的url。
解答:
可以估计每个文件的大小为5G*64=300G (50亿是5000000000,即5G),不可能全部加载到内存中的,因此可以采用分而治之的方法。
- 遍历文件a,对每个url求取hash(url)%1000,然后根据所得值将url分别存储到1000个小文件(设为a0,a1,…a999)当中。这样每个小文件的大小约为300M。遍历文件b,采取和a相同的方法将url分别存储到1000个小文件(b0,b1….b999)中。
- 所有可能相同的url都在对应的小文件(a0 vs b0, a1 vs b1….a999 vs b999)当中,不对应的小文件(比如a0 vs b99)不可能有相同的url。然后我们只要求出1000对小文件中相同的url即可。
- 对于a0 vs b0,我们可以遍历a0,将其中的url存储到hash_map当中。然后遍历b0,如果url在hash_map中,则说明此url在a和b中同时存在,保存到文件中即可。
注: 如果分成的小文件不均匀,导致有些小文件太大(比如大于2G),可以考虑将这些太大的小文件再按类似的方法分成小小文件即可。
转载地址:http://hawstein.com/posts/12.6.html
- 检查网页(url)重复
- url地址重复的检查时,由于时间是毫秒间数据插入会造成重复
- LeetCode 217. Contains Duplicate(检查重复)
- python 网页爬虫(URL)
- 检查重复的数据
- HashSet如何检查重复
- 检查重复的类
- 41、检查重复字符串
- 检查重复字符串
- 检查重复字符串
- java检查URL合法性
- java 检查 URL 合法性
- 检查URL地址
- 检查url是否可用
- 编程练习2----字符串操作(重复字符检查)
- LeetCode 219. Contains Duplicate II(检查重复)
- LeetCode 220. Contains Duplicate III(检查重复)
- 浅谈 SQL 中的锁(四)如何检查重复用户
- lua游戏服务器热更新
- Web服务器环境的搭建
- mybatis绑定错误:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
- CF Hello 2015 C 单调队列解决二维RMQ
- 【深度学习:目标检测】 py-faster-rcnn_caffemodel对人脸进行标注
- 检查网页(url)重复
- Isomorphic Strings——同构结构判断
- Shell脚本循环读取文件中的每一行
- junit的基本使用
- 利用递归查找链表中与数据成员值与形参n相同的结点
- hdu oj 2734 Quicksum
- 百度定位
- lua全局环境变量_G小结
- 【数据库】Windows下修改MySQL数据库Root密码