python解决Mongodb管道聚合后单⽂档16M限制
最近产品定位⼀个问题,因为代码⾥⾯使⽤了管道聚合(aggregate)后,导致⼏万个数据⾥⾯有超过16M的数据,从⽽报了⼀个"BSONobj is invaild. Size must between 0 and 16M"的⼀个错。百度了⼀下,上⾯说的是⼀个document⽂档最⼤尺⼨为16M,⽽超过了16M后就要存到GridFS中,但是我们的mongodb不能修改表结构,不能重启,总之就是不能动,只能从代码⽅⾯着⼿了。
开始也有想过加⼀个参数{“allowDiskUse”: True},但是加了后发现没有⽤,具体原因是因为allowDiskUse是⽤于避免pipeline的stage 的内存使⽤超过100mb⽽报错,⽽我遇到的限制是针对单个⽂件⽽⾔。下⾯是修改前的部分代码
pipeline = []
if match:
pipline.append({'$match': match})
pipeline.append({"$group":{"_id":"$status","count":{$sum":1},"features":{"$push":{"$result.local"}}})
ret = {}
for x in Task.objects.aggregate(*pipeline):
status = x['_id']
if status not in ['finish', 'fail']:
continue
for result in x['features']:
if not result:
continue
features = ('featureList before upgrade', dict())
after = ('featureList after upgrade', dict())
features.update(filter(lambda item:item[1], after.iteritems()))
for k, v in features.iteritems():
if k not in ret:
ret[k] = {
'name': k,
'success':0,
'failed':0
}
temp = ret[k]
if v:
if status =='finish':
temp['success'] += 1
elif status == 'failed':
temp['failed'] += 1
return ret.values()
既然改数据库⾏不通,那只有从数据处理上着⼿了,查了下管道聚合的⼀些资料后,我发现有个"$unwind"的参数正是我需要的,它可以把聚合的数据⾥⾯的"features"给提取出来,⽽“features”⾥⾯的参数,正式导致数据超过16m的罪魁祸⾸,所以就在pipeline后⾯追加这个参数,把需要的数据分离出来。
pipeline = []
if match:
pipline.append({'$match': match})
pipeline.append({"$group":{"_id":"$status","count":{$sum":1},"features":{"$push":{"$result.local"}}})
pipeline.append({"$unwind": "$features"})
ret = {}
分离开后,我们就可以提取出我们需要的⼀些信息出来了,因为最后需要⼀个字典,所以要提前先定义好,⽽“featureList before upgrade”和“featureList after upgrade”是我们需要做处理的⼤⽂件名:
if status not in ['finish', 'fail']:
continue
features = dict()
after = dict()
for result, values in x['features'].items():
if not result:
continue
if result == "featureList before upgrade":
features = dict(values)
python中文文档if result == "featureList after upgrade":
after = dict(values)
features.update(filter(lambda item:item[1], after.iteritems()))
⾄此,所有的聚合⽂档都被分离成⼩⽂件,⽽我们所遇到的问题也就迎刃⽽解了。因为要处理的数据量很⼤,有四万多条,⽽且每天都还在不断的更新,⽽我们采取的是flask和vue前后分离,导致页⾯刷新数据的时候⽐较慢,效率不太⾼,所以⽬前还在考虑有没有什么优化⽅案能够让页⾯刷新数据更快。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论