gpt4 book ai didi

Django 批量更新/插入性能

转载 作者:行者123 更新时间:2023-12-02 14:30:41 26 4
gpt4 key购买 nike

我每 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)

需要发生的事情如下:

  • 收到新的财务数据后,检查数据中是否存在条目数据库。
  • 如果条目存在,请更新要价、出价和上次更新字段
  • 如果该条目不存在,则创建一个新条目

我的代码如下所示:

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)

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

最佳答案

如果您想要这种性能,我不明白您为什么不直接使用原始 SQL。批量创建尚不存在的东西听起来像是高级 SQL 查询,而 Django 并不是真正为之而生的。

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

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

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

Market.objects.bulk_create(bi_markets)

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

关于Django 批量更新/插入性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50112605/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com