这个完整URL有44个字节,一亿个URL就是4G,一亿个URL就要占用4G内存,这还没有算存这一亿个URL需要的数据结构内存,还有待抓取URL,已抓取URL还保存在内存中的html等等消耗的内存。
所以这样直接用set()保存URL是不建议的,除非你的内存有十几个G。
一个取巧的办法是截断URL。只把URL:
https://www.tianyancha.com/company/23402373
的后缀:23402373放进set()里,23402373只占8个字节,一亿个URL占700多M内存。
但是如果你是用的野云主机,用来不断拨号用的非正规云主机,这700多M内存也是吃不消的,机器会非常卡。
就还需要想办法压缩URL的内存占用,可以使用BloomFilter算法,是一个很经典的算法,非常适用海量数据的排重过滤,占用极少的内存,查询效率也非常的高。它的原理是把一个字符串映射到一个bit上,刚才23402373占8个字节,现在只占用1个bit(1字节=8bit),内存节省了近64倍,以前700M内存,现在只需要10多M了。
BloomFilter调用也非常简单,当然需要先install 安装bloom_filter:
from bloom_filter import BloomFilter # 生成一个装1亿大小的
bloombloom = BloomFilter(max_elements=100000000, error_rate=0.1)