内存
pymysql浮动游标获取入口数据,防止一次性加载过量数据至内存,此时不做去重,使用set,hash,md5, 布隆过滤器等进行去重处理,分布式使用redis
class PublicMysqlByIter:
"""mysql_by_iter"""
def __init__(self, connect_data):
self.conn = pymysql.connect(**connect_data)
self.cursor = self.conn.cursor(pymysql.cursors.SSCursor)
注意浮动游标在同一时间只能处理一个事件,如果使用浮动游标做查询,又需要做插入的话,需要使用其他的cursor
去重
安装redisbloom插件,可直接使用redis自带的布隆过滤器,效率比自己写的布隆过滤器高很多,内网状态,推送2万条数据4秒左右,参考(https://github.com/RedisBloom/redisbloom-py)或者直接使用execute_command
result = rds.execute_command("bf.add", boom_filter_key, dup_data)
if int(result) == 0:
logger.info('这条数据重复了~')
continue
从千万级mysql表中取数作为采集入口效率过低问题
设置节点(自增id),每次取少量(比如5-10万条), 采集完后保存节点, 每1-5分钟启动一次,可借助redis做队列
脚本拓展性
设置固定的大框架, 划分为入口、采集、保存等子节点,每次修改只许修改对应子节点即可
网友评论