0

在我们的Django项目中,有一个视图可以创建多个对象(从5到100)。问题在于创建阶段需要很长时间。查看执行时间非常长(超过一分钟)

不知道这是为什么,但我想这可能是因为在n个对象上有n个数据库查找和提交。

例如24个物体需要67秒。

我想加快这个过程。

有两件事情,我认为可能是值得考虑:

  1. 要创建因此只有一个执行COMMIT在一个查询这些对象。
  2. 创建ThreadPool并平行创建这些对象。

这是引起问题的视图的一部分(我们在本地主机上使用的Postgres所以连接是没有问题的)

 @require_POST 
    @login_required 
    def heu_import(request): 
     ... 
     ... 
     product = Product.objects.create(user=request.user,name=name,manufacturer=manufacturer,category=category) 
     product.groups.add(*groups) 
     occurences = [] 
     counter = len(urls_xpaths) 
     print 'Occurences creating' 
     start = datetime.now() 
     eur_currency = Currency.objects.get(shortcut='eur') 
     for url_xpath in urls_xpaths: 
      counter-=1 
      print counter 
      url = url_xpath[1] 
      xpath = url_xpath[0] 
      occ = Occurence.objects.create(product=product,url=url,xpath=xpath,active=True if xpath else False,currency=eur_currency) 
      occurences.append(occ) 
     print 'End' 
     print datetime.now()-start 

     ... 
    return render(request,'main_app/dashboard/new-product.html',context) 

输出:

Occurences creating 
24 
. 
. 
. 
0 
End 
0:01:07.727000 

编辑:

我试图把for循环放入with transaction.atomic():块,但它似乎只帮助一点(47秒而不是67秒)。

EDIT2:

我不知道,但似乎SQL查询是没有问题的:

enter image description here

+0

它没有任何意义,这些货币的对象需要很长时间来打造。发布该实体的代码。 –

+0

减少查询次数,您在循环中创建大量对象,一次创建多个对象。看看 - https://docs.djangoproject.com/en/1.10/ref/models/querysets/#bulk-create – utkbansal

回答

3

请使用bulk_create了插入多个对象。

occurences = []

for url_xpath in urls_xpaths: 
     counter-=1 
     print counter 
     url = url_xpath[1] 
     xpath = url_xpath[0] 
     occurances.append(Occurence(product=product,url=url,xpath=xpath,active=True if xpath else False,currency=eur_currency)) 

Occurence.objects.bulk_create(occurences)