场景:爬虫抓取有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);
}
/**
* 获取 ha