在Django中,为什么queryset的iterator()方法可以减少内存使用?

hgb9j2n6  于 2023-02-20  发布在  Go
关注(0)|答案(1)|浏览(180)

在Django中,我不明白为什么queryset的iterator()方法可以减少内存使用。
Django文档如下所示。
QuerySet通常在内部缓存它的结果,这样重复的计算就不会导致额外的查询。()将直接读取结果,而不在QuerySet级别进行任何缓存(在内部,默认迭代器调用iterator()并缓存返回值)对于一个返回大量只需要访问一次的对象的QuerySet,这可以导致更好的性能和存储器的显著减少。
但是,据我所知,无论是否使用iterator()方法,在求值之后,查询的行都会立即从数据库中取出并加载到内存中。无论查询集是否进行缓存,使用的内存与行数成比例,这不都是一样的吗?那么,假设只对查询集求值一次,使用iterator()方法的好处是什么?
这是因为从数据库获取的原始数据和缓存的数据(示例化后)存储在不同的内存空间中吗?如果是这样,我想我可以理解不使用iterator()方法执行缓存可以节省内存。

vjrehmav

vjrehmav1#

使用iterator时,Django使用DB游标逐行获取数据,如果使用all并使用python迭代,那么所有记录都将缓存在内存中,而你需要一个接一个的记录。
因此,通过使用iterator,您使用的是DB游标,并逐个获取数据,而其他记录不会一次全部获取。

相关问题