0
在我们的Django项目中,有一个视图可以创建多个对象(从5到100)。问题在于创建阶段需要很长时间。查看执行时间非常长(超过一分钟)
不知道这是为什么,但我想这可能是因为在n个对象上有n个数据库查找和提交。
例如24个物体需要67秒。
我想加快这个过程。
有两件事情,我认为可能是值得考虑:
- 要创建因此只有一个执行COMMIT在一个查询这些对象。
- 创建
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查询是没有问题的:
它没有任何意义,这些货币的对象需要很长时间来打造。发布该实体的代码。 –
减少查询次数,您在循环中创建大量对象,一次创建多个对象。看看 - https://docs.djangoproject.com/en/1.10/ref/models/querysets/#bulk-create – utkbansal