私たちの Django プロジェクトには、複数のオブジェクト (5 から 100 まで) を作成するビューがあります。問題は、フェーズの作成に非常に長い時間がかかることです。
理由はわかりませんが、n 個のオブジェクトに対して、n 回のデータベース ルックアップとコミットが行われている可能性があると考えられます。
たとえば、24 個のオブジェクトには 67 秒かかります。
このプロセスをスピードアップしたい。
検討する価値があると思われる2つのことがあります。
- これらのオブジェクトを 1 つのクエリで作成し、コミットが 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
編集:
for ループをブロックに入れようとしましたwith transaction.atomic():
が、少ししか役に立たないようです (67 秒ではなく 47 秒)。
EDIT2:
よくわかりませんが、SQL クエリは問題ではないようです。