[英]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.