查看执行时间很长(超过一分钟)

时间:2016-12-31 15:34:37

标签: django postgresql django-models django-views django-postgresql

在我们的Django项目中,有一个视图可以创建多个对象(从5到100)。问题是创建阶段需要很长时间。

不知道为什么会这样,但我想这可能是因为在n个对象上有n个数据库查找和提交。

例如,24个对象需要67秒。

我想加快这个过程。

我认为有两件事值得考虑:

  1. 在一个查询中创建这些对象,因此只执行一次提交。
  2. 创建ThreadPool并平行创建这些对象。
  3. 这是导致问题的视图的一部分(我们在localhost上使用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查询不是问题:

    enter image description here

1 个答案:

答案 0 :(得分: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)