0

Djangoプロジェクトでは、複数のオブジェクト(5から100まで)を作成するビューがあります。問題は、フェーズの作成に非常に時間がかかることです。実行時間が非常に長い(1分以上)

なぜそうはわかりませんが、n個のオブジェクト上にn個のデータベースの検索とコミットがあるためと思われます。

たとえば、24個のオブジェクトには67秒かかります。

私はこのプロセスをスピードアップしたいと思います。

私は検討する価値があるかもしれないと思う二つのものがあります。

  1. 1がコミットので、一つだけのクエリでこれらのオブジェクトを作成するには、実行されます。
  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 

EDIT:

forループをwith transaction.atomic():ブロックに入れようとしましたが、ほんの少しだけ助けてください(67秒ではなく47秒)。

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) 
関連する問題