django如何缓存RawQuerySet

时间:2015-07-17 08:50:58

标签: python django

在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所说,这里的评论是错误的。这里没有任何缓存操作。

1 个答案:

答案 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