拉取、入库的优化点:
-
请求接口:
-
数据入库:
-
场景:入库时候可能会一次性插入上万条大数据,数据库和本地内存会承受较大压力 -
解决:可以采用python yield关键字,把数据分片处理
-
使用举例: def chunk_request():
for xxx in 一堆数据:
yield xxx
def chunk(iterator, bulk_size=50):
"""
工具方法, 返回一批结果的迭代器
"""
for item in iterator:
yield chain([item], islice(iterator, bulk_size - 1))
for items in chunk(self.chunk_request(start=start, end=end)):
-
对于yield自己的理解:有点像协程的概念,平时我们一个return,方法就直接结束,返回结果了,但是使用了yield就很好玩了,你可以先返回一个结果,然后再回到上次返回结果的地方,继续往下执行。所以利用这个特性,我们就可以将数据给分片处理了,先返回一小部分结果,然后入库,再返回执行,拿到下一批结果,再入库,而不是一次return一大堆数据。 -
升级版本: 不仅做到控制数据小批量入库,还可以控制到源头数据小批量拉取(利用上边讲的特性,会返回方法里继续往下执行代码)
|