Django 批量更新/插入性能

ced*_*eds 5 django django-models django-database python-3.x

我每 5 秒收到大约 5000 个工具的财务数据,需要更新数据库中的相应条目。该模型如下所示:

class Market(models.Model):
    market = models.CharField(max_length=200)
    exchange = models.ForeignKey(Exchange,on_delete=models.CASCADE) 
    ask = models.FloatField()
    bid = models.FloatField()
    lastUpdate = models.DateTimeField(default = timezone.now)
Run Code Online (Sandbox Code Playgroud)

需要发生的事情如下:

  • 收到新的财务数据后,检查数据库中是否存在条目。
  • 如果条目存在,则更新 ask、bid 和 lastUpdate 字段
  • 如果条目不存在,则创建一个新条目

我的代码如下所示:

bi_markets = []
for item in dbMarkets:
    eItem = Market.objects.filter(exchange=item.exchange,market=item.market)
    if len(eItem) > 0:
        eItem.update(ask=item.ask,bid=item.bid)
    else:
        bi_markets.append(item)

#Bulk insert items that does not exist
Market.objects.bulk_create(bi_markets)  
Run Code Online (Sandbox Code Playgroud)

但是,执行此操作需要的时间太长。大约 30 秒。我需要将时间减少到 1 秒。我知道这可以在 100 毫秒内完成,因为我在 .NET 中执行相同的自定义 SQL 代码。知道如何提高 Django 的性能吗?

Alp*_*per 1

如果\xe2\x80\x99 是你想要的这种性能,我不明白\xe2\x80\x99 为什么你不会\xe2\x80\x99 直接进入原始SQL。批量创建那些不存在的东西听起来像是 Django 真正为之设计的高级 SQL 查询。

\n\n

https://docs.djangoproject.com/en/2.0/topics/db/sql/

\n\n

您还可以执行以下操作(抱歉在移动设备上):

\n\n
bi_markets = []\nfor item in dbMarkets:\n  rows = Market.objects.filter(exchange=item.exchange, market=item.market).update(ask=item.ask, bid=item.bid)\n  if rows == 0:\n    bi_markets.append(item)\n\nMarket.objects.bulk_create(bi_markets)\n
Run Code Online (Sandbox Code Playgroud)\n\n

也许这种组合会生成一些更好的 SQL,并且它也会回避调用exists()update返回它更改的行数)。

\n