相关疑难解决方法(0)

为什么要遍历占用大量内存的大型Django QuerySet?

该表包含大约一千万行.

for event in Event.objects.all():
    print event
Run Code Online (Sandbox Code Playgroud)

这导致内存使用量稳定增加到4 GB左右,此时行快速打印.第一行打印之前的漫长延迟令我感到惊讶 - 我预计它几乎可以立即打印出来.

我也尝试过Event.objects.iterator()以同样的方式行事.

我不明白Django加载到内存中的原因或为什么会这样做.我希望Django的通过在数据库级别的结果迭代,which'd意味着结果将在大约(长时间的等待之后,而不是一次全部)以恒定的速率进行打印.

我误解了什么?

(我不知道它是否是相关的,但我使用PostgreSQL.)

sql django postgresql django-orm

104
推荐指数
8
解决办法
4万
查看次数

在*Large*Django QuerySet中限制内存使用

我有一个任务需要每隔一段时间(每天一次,每周一次,无论如何)在我的数据库中的"大多数"对象上运行一次.基本上这意味着我有一些看起来像这样运行在它自己的线程中的查询.

for model_instance in SomeModel.objects.all():
    do_something(model_instance)
Run Code Online (Sandbox Code Playgroud)

(请注意,它实际上是一个filter()而不是所有()但是我仍然最终选择了一组对象.)

我遇到的问题是,运行一段时间之后线程被我的托管服务提供商杀死,因为我使用了太多内存.我假设所有这些内存使用正在发生,因为即使QuerySet我的查询返回的对象最初具有非常小的内存占用量,它最终会随着QuerySet对象model_instance在迭代它们时缓存每个内容而增长.

我的问题是," SomeModel以内存有效的方式迭代几乎每个数据库中的最佳方法是什么?" 或者我的问题是"如何从django查询集中取消缓存'模型实例?"

编辑:我实际上使用查询集的结果来构建一系列新对象.因此,我最终不会更新查询的对象.

python django memory-management django-queryset

22
推荐指数
6
解决办法
9103
查看次数