首页
学习
活动
专区
圈层
工具
发布

Scrapy爬虫去重效率优化之Bloom Filter的算法的对接

当爬取达到亿级别规模时,Scrapy-Redis提供的集合去重已经不能满足我们的要求。所以我们需要使用一个更加节省内存的去重算法Bloom Filter。 1....利用这个算法我们可以实现去重效果。 本节我们来了解Bloom Filter的基本算法,以及Scrapy-Redis中对接Bloom Filter的方法。 2....Bloom Filter的算法 在Bloom Filter中使用位数组来辅助实现检测判断。在初始状态下,我们声明一个包含m位的位数组,它的所有位都是0,如下图所示。 ?...接下来,我们将Bloom Filter算法应用到Scrapy-Redis分布式爬虫的去重过程中,以解决Redis内存不足的问题。 3....这样就成功利用Bloom Filter替换了Scrapy-Redis的集合去重。

4.4K72
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    海量数据处理算法—Bloom Filter

    Bloom-Filter算法简介 Bloom-Filter,即布隆过滤器,1970年由Bloom中提出。它可以用于检索一个元素是否在一个集合中。...因此,Bloom Filter不适合那些“零错误”的应用场合。而在能容忍低错误率的应用场合下,Bloom Filter比其他常见的算法(如hash,折半查找)极大节省了空间。...Bloom Filter的详细介绍:Bloom Filter 2、 Bloom-Filter的基本思想 Bloom-Filter算法的核心思想就是利用多个不同的Hash函数来解决“冲突”。...所以一个简单的改进就是 counting Bloom filter,用一个counter数组代替位数组,就可以支持删除了。 此外,Bloom Filter的hash函数选择会影响算法的效果。...此时,Bloom-Filter算法是最好的选择。

    2.4K10

    百万级并发下的去重挑战:Bloom Filter 与 Redis 的组合方案

    四、最终方案:Bloom Filter + Redis + 持久化备份最后定下的架构是这样的:Bloom Filter 负责实时查重,超快;Redis HyperLogLog 负责全局唯一统计(看总共抓了多少个不同...URL);文件持久化 定时保存Bloom Filter状态,防止重启丢失。...整个数据流大概长这样:URL输入 → Bloom Filter查重 → (新URL) → Redis队列 → 爬取 → 存库 ↘ 每日写入文件备份既快、...}")这段代码实际跑下来非常稳:单机百万URL查重耗时仅 2~3ms;Bloom Filter内存占用在15MB左右;HyperLogLog统计误差低于1%。...七、总结:没有完美方案,只有合理组合层级工具作用内存层Bloom Filter高速查重分布式层Redis HyperLogLog唯一数统计存储层文件 / SQLite宕机恢复做采集久了你会发现: “去重

    51310

    布隆过滤器(bloom filter)的原理及在推荐去重中的应用

    遇到的问题 在业务中,我需要给每个用户保存1w条浏览记录,之后每一次的返回值都要和历史记录做一个去重,即保证用户不会重复看到同一篇文章....布隆过滤器 介绍 以下摘自维基百科: 布隆过滤器(英语:Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。...它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。 说直白一点就是:布隆过滤器用自己的算法,实现了快速的检索一个元素是否在一个较大的元素列表之中....我的解决方案 1. hbase部分 hbase负责存储用户浏览记录的原始数据,只保存用户浏览的文章的id或者url,这里以id为例....布隆过滤器部分 主要是添加以及查询两个操作,从hbase拿到数据之后,构造过滤器,然后对当前返回的10条内容进行判重.之后将新的10条内容加入过滤器,再次写入redis. 流程图 ?

    2.7K30

    快速入门网络爬虫系列 Chapter04 | URL管理

    三、Bloom Filter Bloom Filter是在1970年代由Bloom出的一种多哈希函数映射的快速查找算法 它是一种空间效率高的随机数据结构 使用位数组表示一个集合 判断一个元素是否属于这个集合...Bloom Filter的基本思路是:通过多个不同的Hash函数来解决“冲突” Bloom Filter主要包含以下两个部分: 1个比特数组:长度为m,并初始化为0 k个hash函数:进行URL哈希,...w是要判断的URL: 可以看到,w经过hash之后三个对应的位置上有一个不是1,我们可以肯定这个URL没有被抓取过 3.1、Bloom Filter的缺点 Bloom Filter的查询时间和空间效率虽高...,但是有以下缺点: Bloom Filter集合中的元素无法删除 如何确定位数组的大小以及hash函数的个数 Bloom Filter会出现错误判断,无法达到零错误 3.2、Bloom Filter通常的应用场景...B 不会因为域名更换而不收录 五、简单小结 1、URL去重的方法 Hash去重方法速度快,实现简单,但无法应对大数据量 使用Bloom Filter来对URL进行去重 2、URL重定向 Dispatch

    2.2K30

    海量数据处理利器之布隆过滤器

    看见了海量数据去重,找到停留时间最长的IP等问题,有博友提到了Bloom Filter,我就查了查,不过首先想到的是大叔,下面就先看看大叔的风采。...一、布隆过滤器概念引入       (Bloom Filter)是由布隆(Burton Howard Bloom)在1970年提出的。...它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率(假正例False positives,即Bloom Filter报告某一元素存在于某集合中,但是实际上该元素并不在集合中)和删除困难...方法1:基本的排序方法包括冒泡,快排等。      方法2:使用BitMap算法      方法1就不介绍了,方法2中所谓的BitMap是一个位数组,跟平时使用的数组的唯一差别在于操作的是位。...不过有一种布隆过滤器的变体Counter Bloom Filter,可以支持删除元素,感兴趣的读者可以查阅相关文献资料。

    1.7K50

    Redis缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题

    思考 5TB的硬盘上放满了数据,请写一个算法将这些数据进行排重。如果这些数据是一些32bit大小的数据该 如何解决?如果是64bit的呢?...对于空间的利用到达了一种极致,那就是Bitmap和布隆过滤器(Bloom Filter)。...它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。 Bloom-Filter算法的核心思想就是利用多个不同的Hash函数来解决“冲突”。...Hash存在一个冲突(碰撞)的问题,用同一个Hash得到的两个URL的值有可能相同。...这便是Bloom-Filter的基本思想。 Bloom-Filter一般用于在大数据量的集合中判定某元素是否存在。

    3.1K20

    分布式爬虫去重:Python + Redis实现高效URL去重

    visited_urls = set()if url not in visited_urls: visited_urls.add(url) # 抓取逻辑Bloom Filter(布隆过滤器)...4.3 方案3:使用 Redis Bloom Filter(需安装RedisBloom模块)Redis 官方提供 RedisBloom 模块,支持布隆过滤器(需额外安装):# 需确保Redis服务器加载了..."if not bloom_deduper.is_visited(url): bloom_deduper.mark_visited(url) print(f"抓取: {url}")else:...Filter可调中海量URL(需额外模块)优化建议:短URL优化:存储URL的MD5或SHA1哈希值(减少内存占用)。...结论在分布式爬虫中,Redis 是URL去重的理想选择,支持多种数据结构:精确去重 → Redis Set低内存消耗 → HyperLogLog可控误判率 → Bloom Filter通过合理选择方案,

    68810

    使用bloomfilter修改scrapy-redis去重

    在这种情况下,我们要么通过增加内存来提高爬取上限,要么就改变去重算法来减少内存占用。增加内存对于我们来说不太合适(qiong),那么就要改变去重算法了。bloomfilter就是这样一个算法。...Bloomfilter算法简介 Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。...Bloom Filter的这种高效是有一定代价的:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合。因此,Bloom Filter不适合那些“零错误”的应用场合。...而在能容忍低错误率的应用场合下,Bloom Filter通过极少的错误换取了存储空间的极大节省。 集合表示和元素查询 下面我们具体来看Bloom Filter是如何用位数组表示集合的。...初始状态时,Bloom Filter是一个包含m位的位数组,每一位都置为0。

    1.7K20

    Bloom Filter的对接

    14.4 Bloom Filter 的对接 首先回顾一下 Scrapy-Redis 的去重机制。...当爬取达到亿级别规模时,Scrapy-Redis 提供的集合去重已经不能满足我们的要求。所以我们需要使用一个更加节省内存的去重算法 Bloom Filter。 1....Bloom Filter 的空间利用效率很高,使用它可以大大节省存储空间。Bloom Filter 使用位数组表示一个待检测集合,并可以快速地通过概率算法判断一个元素是否存在于这个集合中。...利用这个算法我们可以实现去重效果。 本节我们来了解 Bloom Filter 的基本算法,以及 Scrapy-Redis 中对接 Bloom Filter 的方法。 2....BloomFilter 的算法 在 Bloom Filter 中使用位数组来辅助实现检测判断。在初始状态下,我们声明一个包含 m 位的位数组,它的所有位都是 0,如图 14-7 所示。

    75020

    【算法】BloomFilter概念和原理以及业务中的应用场景

    Filter将标准 Bloom Filter位数组的每一位扩展为一个小的计数器(counter),在插入元素时给对应的k(k为哈希函数个数)个Counter的值分别加1,删除元素时给对应的k个Counter...Counting Bloom Filter通过多占用几倍的存储空间的代价,给Bloom Filter增加了删除操作。...,根据业务数据量设置位数组的大小,将位数组全部设置为0;将每个URL地址通过哈希算法处理,获得相应的哈希值;根据哈希值计算出位数组中的位置,将位数组中的位置设置为1;当新的URL地址进入时,重复上述步骤计算出对应的位置检查位数组中的位置是否为...0,如果是0,则表示该URL地址一定没被爬取过;如果URL地址不存在,经过爬虫处理后,则将其对应的位置设置为1,以表示该URL地址已经存在;重复上述步骤,直到所有的URL地址都处理完毕,完成去重。...具体的SpringBoot整合案例请看我的另外一篇文章:【案例实战】爬虫URL去重实战-SpringBoot2.x+Guava布隆过滤器图片(4)海量数据下-分库分表下手机号重复注册解决方案一般业务里面的

    1.6K00

    由散列表到BitMap的概念与应用(二)

    本文将会具体讲解BitMap的扩展:布隆过滤器(Bloom filter)。...算法描述 集合表示与元素查询 具体来看Bloom Filter是如何用位数组表示集合的。初始状态时,Bloom Filter是一个包含m位的位数组,每一位都置为0。 ?...因此他有如下三个使用场景: 网页爬虫对URL的去重,避免爬取相同的URL地址 反垃圾邮件,从数十亿个垃圾邮件列表中判断某邮箱是否垃圾邮箱(同理,垃圾短信) 缓存击穿,将已存在的缓存放到布隆过滤器中,当黑客访问不存在的缓存时迅速返回避免缓存及...这里只要增加一个bloom算法的服务,服务端插入一个key时,在这个服务中设置一次。需要查询服务端时,先判断key在后端是否存在,这样就能避免服务端的压力。...参考 大量数据去重:Bitmap和布隆过滤器(Bloom Filter) https://blog.csdn.net/zdxiq000/article/details/57626464 布隆过滤器 (Bloom

    94030

    分布式爬虫数据存储开发实战

    实战: 作为第一道防线,快速过滤掉极大概率重复的 URL。需要定期重建或使用可扩展的布隆过滤器(如 Scalable Bloom Filter)。...布谷鸟过滤器 (Cuckoo Filter): Bloom Filter 的改进,支持删除操作,在某些场景下性能更好。...集成去重逻辑:在 URL 入队列(或抓取前)进行去重检查。结合 Bloom Filter (快速初步过滤) 和 Redis Set/数据库 (精确判断)。...去重瓶颈: 单个 Redis Set 或 Bloom Filter 容量有限。对于百亿级 URL,需要设计分布式去重方案(如基于 URL 哈希分片到多个 Redis 实例或使用分布式布隆过滤器)。...(批处理、异步、幂等、重试)实现健壮的去重和状态管理。 (Bloom Filter + Redis/DB)确保高可用和容错。 (副本、持久化、备份、任务重试)持续监控、调优和优化成本。

    64510

    深度剖析各种BloomFilter的原理、改进、应用场景

    Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合。 一....若要降低冲突发生的概率到1%,就要将BitSet的长度设置为URL个数的100倍。   实质上上面的算法都忽略了一个重要的隐含条件:允许小概率的出错,不一定要100%准确!...Bloom Filter的算法   废话说到这里,下面引入本篇的主角——Bloom Filter。其实上面方法4的思想已经很接近Bloom Filter了。...Bloom Filter算法如下:   创建一个m位BitSet,先将所有位初始化为0,然后选择k个不同的哈希函数。...Bloomier Filters Decaying Bloom Filters Stable Bloom Filter Space Code Bloom Filter Filter Banks Scalable

    2.3K20

    高级算法篇:布隆过滤器?非也,布谷鸟过滤器是也

    过滤器在数据科学中的应用十分广泛,包括数据库查询、数据快速检索,数据去重等等。过滤器的出现是为了解决在大量数据的环境下,能够更好更快的(节省计算资源或者存储资源)筛查数据的需求。...实际的应用场景有: 爬虫程序的URL识别:即爬虫在访问 URL 时对 URL 进行判断,如果访问过(在集合中)就不访问,如果没有访问过那么就访问然后放入已访问集合,提高爬虫效率。...Bloom filter Bloom filter 使用 hash 函数的散列技术存储信息的存在状态而不是存储信息本身,常常用于判断一个信息是否在一个集合中,这样只需要几个bit的空间就能解决问题。...基本原理 bloom filter作为一种海量数据处理算法,其要点在于用于存储的位数组和用于处理的hash函数(一般有多个,并且为了精确度和数据量增加)。...Cuckoo filter理解 原理 Cuckoo filter 同样使用哈希表来实现数据到实际存储区域的映射,不同于 Bloom filer 的是Cuckoo filter中只采用两个哈希映射函数 H1

    3.7K10

    内存受限下找出亿级整数集合中的不重复元素

    这时就需要设计适合内存受限环境的算法,来解决问题。本文将以在内存不足的情况下,找出亿级规模整数集合中的不重复元素为例,探讨一种基于Bloom Filter的数据结构的解决方案。...Bloom Filter解法针对上述问题,我们可以考虑使用Bloom Filter这种空间效率极高的概率数据结构。Bloom Filter本质是一个很长的二进制向量和一系列随机映射函数。...具体地,思路是:初始化一个225MB大小的Bloom Filter分批读取整数数据,每次处理1万个对每批数据,将元素存入Bloom Filter再次遍历数据,检查每个元素是否在Bloom Filter中命中未命中的元素即为不重复元素代码实现...二次遍历时只检查元素是否在Bloom Filter中,而不需要加载集合本身。总结对于内存无法容纳的超大数据集,使用Bloom Filter可以实现高效地去重和查询。...本文给出了一种基于Bloom Filter解决大整数去重问题的设计思路。虽然无法覆盖所有场景,但希望可以作为算法设计的一个模板

    70030
    领券