0

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

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

例如 24 个对象需要 67 秒。

我想加快这个过程。

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

  1. 在一次查询中创建这些对象,因此只执行一次提交。
  2. 创建一个ThreadPool并并行创建这些对象。

这是导致问题的视图的一部分(我们在 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 秒)。

编辑2:

我不确定,但似乎 SQL 查询不是问题:

在此处输入图像描述

4

1 回答 1

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)
于 2016-12-31T15:58:59.930 回答