View execute time is very long (above one minute)

134 views Asked by At

In our Django project, there is a view which creates multiple objects (from 5 to even 100). The problem is that creating phase takes a very long time.

Don't know why is that so but I suppose that it could be because on n objects, there are n database lookups and commits.

For example 24 objects takes 67 seconds.

I want to speed up this process.

There are two things I think may be worth to consider:

  1. To create these objects in one query so only one commit is executed.
  2. Create a ThreadPool and create these objects parallel.

This is a part of the view which causes problems (We use Postgres on localhost so connection is not a problem)

     @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)

Output:

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

EDIT:

I tried to put the for loop into the with transaction.atomic(): block but it seems to help only a bit (47 seconds instead of 67).

EDIT2:

I'm not sure but it seems that SQL queries are not a problem:

enter image description here

1

There are 1 answers

0
Rahul Reddy Vemireddy On

Please use bulk_create for inserting multiple objects.

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)