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


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

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

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

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

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

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

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

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

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

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

  • 相关阅读:
    单例模式
    建造者模式
    工厂模式
    八大排序算法之插入排序
    八大排序算法之基数排序
    lua 4 使用table实现其他数据结构,并介绍遍历方法
    lua 3 循环
    lua 2 变量
    lua 1 基本语法和注意事项
    template指针小测试
  • 原文地址:https://www.cnblogs.com/thomaszdxsn/p/wei-shen-me-yao-shi-yongQuerySetiterator.html
Copyright © 2020-2023  润新知