0
Djangoプロジェクトでは、複数のオブジェクト(5から100まで)を作成するビューがあります。問題は、フェーズの作成に非常に時間がかかることです。実行時間が非常に長い(1分以上)
なぜそうはわかりませんが、n個のオブジェクト上にn個のデータベースの検索とコミットがあるためと思われます。
たとえば、24個のオブジェクトには67秒かかります。
私はこのプロセスをスピードアップしたいと思います。
私は検討する価値があるかもしれないと思う二つのものがあります。
- 1がコミットので、一つだけのクエリでこれらのオブジェクトを作成するには、実行されます。
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
EDIT:
forループをwith transaction.atomic():
ブロックに入れようとしましたが、ほんの少しだけ助けてください(67秒ではなく47秒)。
EDIT2:
私はわからないが、SQLクエリが問題ではないようだ。
これは、これらの通貨のオブジェクトが作成に時間がかかることを全く意味がありません。そのエンティティのコードを投稿してください。 –
クエリの数を減らし、ループ内に多数のオブジェクトを作成し、複数のオブジェクトを同時に作成します。ご覧ください - https://docs.djangoproject.com/en/1.10/ref/models/querysets/#bulk-create – utkbansal