在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所说,这里的评论是错误的。这里没有任何缓存操作。
答案 0 :(得分:0)
这里的“缓存”术语有点令人困惑。这里没有真正的“缓存”,只是创建了局部变量来存储循环不变量,以避免在以下代码中对这些名称进行任何属性查找,调用或其他任何操作。
FWIW,RawQuerySet
中的“缓存”并不多...... RawQuerySet.iter() - 只迭代RawQuery
,处理原始结果并产生它们 - 也不是RawQuery.__iter__()
- 正在缓存任何内容。此时,高内存消耗的唯一潜在原因是conditional call to list(self.cursor)
,它不是缓存,但确实可以在巨大的数据集上占用相当大的空间。
作为旁注:Python processes tend to keep most of the already allocated memory。