繁体   English   中英

django如何缓存RawQuerySet

[英]How django cache RawQuerySet

在Django中执行巨大的RawQuerySet时遇到内存问题。 而且gc.collect()无法在查询后释放内存。 我在Django中检查代码。 找到此代码片段https://github.com/django/django/blob/stable/1.6.x/django/db/models/query.py#L1391-L1396

    # Cache some things for performance reasons outside the loop.
    db = self.db
    compiler = connections[db].ops.compiler('SQLCompiler')(
        self.query, connections[db], db
    )
    need_resolv_columns = hasattr(compiler, 'resolve_columns')

但是我不明白django是如何缓存它的。 似乎只是在这里获取列。 我的问题django如何在此代码段中缓存它? 非常感谢你。

更新:

谢谢@ bruno-desthuilliers的帮助,但我发现真正的原因是MySQLdb.Cursor。 https://github.com/PyMySQL/mysqlclient-python/blob/master/MySQLdb/cursors.py#L533-L534 Django仅可使用StoreResultCursor并获取所有结果并将其存储到内存中。 正如@ bruno-desthuilliers所说,这里的评论是错误的。 这里没有任何缓存操作。

“缓存”一词在这里有点令人困惑。 这里没有真正的“缓存”,只有创建局部变量来存储循环不变式,以避免在下面的代码中对这些名称进行任何属性查找,调用或任何操作。

FWIW, RawQuerySet的“缓存”一词并不多 iter () -仅对RawQuery进行迭代,处理原始结果并产生原始结果RawQuery.__iter__() -也不会缓存任何内容。 在这一点上,导致高内存消耗的唯一潜在原因是list(self.cursor)条件调用,它不是高速缓存,但实际上可以吞噬庞大数据集上的相当大的空间。

附带说明: Python进程倾向于保留大多数已分配的内存

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM