当前位置: 首页 > 面试题库 >

为什么要遍历大型Django QuerySet消耗大量内存?

申炳
2023-03-14
问题内容

该表包含大约一千万行。

for event in Event.objects.all():
    print event

这会导致内存使用量稳定增加到4 GB左右,这时行将快速打印。第一行打印之前漫长的延迟使我感到惊讶–我希望它几乎可以立即打印。

我也尝试过Event.objects.iterator()以相同的方式表现。

我不知道Django将什么加载到内存中或为什么这样做。我希望Django在数据库级别遍历结果,这意味着结果将以大致恒定的速率打印(而不是经过漫长的等待一次全部打印)。

我误会了什么?

(我不知道它是否相关,但是我正在使用PostgreSQL。)


问题答案:

ate C距离很近,但不太远。

从文档:

你可以通过以下方式评估QuerySet:

  • 迭代。QuerySet是可迭代的,并且在你第一次对其进行迭代时会执行其数据库查询。例如,这将打印数据库中所有条目的标题:
for e in Entry.objects.all():
    print e.headline

因此,当你第一次进入该循环并获得查询集的迭代形式时,一次就可以检索一千万行。你遇到的等待是Django加载数据库行并为每个数据库行创建对象,然后返回实际上可以迭代的内容。然后,你将所有内容存储在内存中,结果溢出了。

根据我对文档的阅读,iterator()仅能绕过QuerySet的内部缓存机制。我认为一件一件一件地做是有意义的,但是相反,这需要对数据库进行一千万次单独点击。也许不是所有想要的。



 类似资料:
  • Haskell有一个不变地返回输入的标识函数。定义很简单: 为了好玩,这应该输出8: 几秒钟后(根据任务管理器,大约2 gb内存),编译失败,ghc:内存不足。同样,口译员说ghci:内存不足。 由于是一个非常简单的函数,我不希望它在运行时或编译时成为内存负担。所有内存都用于什么?

  • 似乎是正在消耗大量内存,即使在应该释放任何资源之后也是如此。简单的演示 产出: 如果替换部分, 使用率大幅下降: 我在这里误解了什么/做错了什么?正在加载的文件很大(~60MB),但即使XNode需要使用那么多内存,也不应该在时间?

  • 我为我的Java web应用程序分配了一个最大值。由于一些内存泄漏,应用程序已经消耗了将近2 GB的分配内存。此时,我已经使用进行了内存转储。在一个实例中,堆转储大小接近>1.5GB,而在另一个实例中,堆转储大小<100 MB。这背后的原因是什么?

  • 所以我想知道为什么Flink需要很多内存。主要原因是什么?闪现本身的一些缺点?还是保存历史数据?或者别的什么? 我能用像Redis这样的东西来避免这个问题吗?

  • 在过去的几周里,我们一直在关注这个问题。 每隔几天,我们compose.ioMongo数据库的连接数就会飙升至近5000,这是连接限制。似乎没有任何特定的触发此行为。 日志如下所示: Compose支持告诉我们,这几乎肯定是MongoDB驱动程序的问题,我们应该使用连池。我们需要实现Meteor连接池的一些配置吗?

  • 问题内容: 我有一个简单的应用程序,它需要遍历一个大型数组(包含约2万个项目),并且在每个数组中,我解析一个子数组。每个项目如下所示: 我正在遍历每个项目。我要做的是首先读取长度,然后简单地遍历整个数组。但这非常慢(例如每秒1个项目)。 有没有优化的方法? 问题答案: 得到它了。多亏了Erwin,我可以一次将整个JSON解析成一个简单的样子: 然后我们可以简单地调用以访问循环中的特定项目: