【问题标题】:Summary values on a Django Model with tens of millions of records具有数千万条记录的 Django 模型上的汇总值
【发布时间】:2020-04-27 18:52:05
【问题描述】:

我有一个在 PostgreSQL 上开发的 Django 模型,有超过 2000 万条记录。

大量的数据使得甚至无法获得所有行的简单计数。

from myapp.models import LargeModel

len(LargeModel.objects.all())

有什么解决方法吗?

【问题讨论】:

    标签: python django postgresql django-models


    【解决方案1】:

    不要使用len(..)here,因为它会强制加载内存中的 2000 万条记录。

    可以通过.count() [Django-doc]获取记录数:

    from myapp.models import LargeModel
    
    LargeModel.objects.count()

    这将使查询看起来像:

    SELECT COUNT(*)
    FROM myapp_largemodel

    如果您使用len(..),Django 将评估查询集,这意味着它将进行类似SELECT * FROM myapp_largemodel 的查询。因此,它将首先在内存中加载约 2000 万条记录(如果可能的话),然后在该列表上计算 len(..)。但这将因此需要大量内存、CPU 周期和网络带宽。如果你不打算对这些记录做任何事情,那就是资源的低效使用。

    或者正如.count() [Django-doc] 上的文档所说:

    count() 调用在后台执行SELECT COUNT(*),因此您应该始终使用count(),而不是将所有记录加载到 Python 对象中并在结果上调用 len() (除非您无论如何都需要将对象加载到内存中,在这种情况下len() 会更快)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-28
      • 2022-07-22
      • 2021-12-21
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多