场景:爬虫抓取有500亿个URL的网站,怎么更节省资源做到每天不重复抓取
假设一个URL有44个字节,一亿个URL就是4G,一亿个URL就要占用4G内存。
这是就需要想办法压缩URL的内存占用,可以使用BloomFilter算法,是一个很经典的算法,非常适用海量数据的排重过滤,占用极少的内存,查询效率也非常的高。它的原理是把一个字符串映射到一个bit上,刚才23402373占8个字节,现在只占用1个bit(1字节=8bit),内存节省了近64倍,以前700M内存,现在只需要10多M了。
布隆过滤器的原理可以参考这里,非常详细:http://imhuchao.com/1271.html
以下程序是为了理解其原理,仅供参考。其中,哈希函数的数量,位数组的大小都有计算公式,可以参考上文链接。本程序为了简单起见,直接写死。
class Bloom {
// 哈希函数的数量
protected $hashNum = 10;
// 位数组的大小
protected $bitArrayCount = 6000;
// 位数组
protected $bitArray = [];
public function __construct()
{
// 构建默认的位数组,全部置为 false
$this->bitArray = array_pad([], $this->bitArrayCount, false);
}
/**
* 获取 hash 函数;也就是在位数组中,需要改为 true 的索引
* @param string $item 元素
* @return array
*/
protected function getIndexes($item): array
{
$indexes = [];
for ($i = 0; $i &

面对500亿个URL的爬虫抓取任务,通过布隆过滤器可以显著节省内存,将每个URL的44字节压缩到1个bit,实现高效排重过滤。本文介绍了布隆过滤器的基本原理,并提供了一个简单的PHP实现示例,哈希函数数量和位数组大小可通过公式计算,但此处为简化直接写死。
最低0.47元/天 解锁文章
407

被折叠的 条评论
为什么被折叠?



