为什么要使用`QuerySet.iterator()`

用django的custom command功能,写了一个脚本,目的是修正生成环境的数据,tqdm告诉我运行时长预估是2小时。

一个小时后,正在吃午饭的我,接到了很多微信推送。客户告诉我服务不可用,同事告诉我服务器挂掉了。

赶紧重启了uwsgi,一切又正常了。

到底是什么原因呢?我不管,重新启动脚本,然后去吃饭。

回来以后,我发现内存占用率已经达到了80%!其中大多数是那个脚本造成的,赶紧把它停下!

万能的谷歌让我搜到了类似的问题。原来,内存泄漏的本质原因是因为我对queryset

queryset有lazycache的特性。lazy意味着,除非对queryset作了特定的操作,否则不会执行SQL。cache意味着重复使用相同的queryset,不会重复执行SQL。

也就是说,因为cache的原因,如果你迭代一个巨大的queryset,内存会缓慢增长直到你的机器上限!

为了解决这个问题,我们需要使用queryset.iterator()方法。.iterator()方法会创建一个生成器,使用过的数据会被删除!

所以这次问题完美的解决了。

猜你喜欢

转载自www.cnblogs.com/thomaszdxsn/p/wei-shen-me-yao-shi-yongQuerySetiterator.html