随着执行更多插入,Django应用程序中的数据库插入逐渐变慢

时间:2018-04-17 14:09:40

标签: django python-3.x postgresql performance django-rest-framework

我使用Django ORM bulk_create()将大量行插入Postgresql数据库。我大致有以下代码:

entries = []
start = time()
for i, row in enumerate(initial_data_list):
    serializer = serializer_class(data=row, **kwargs)
    serializer.is_valid(raise_exception=True)
    entries.append(MyModel(**serializer.initial_data))
    if i % 1000 == 0:
        MyModel.objects.bulk_create(entries)
        end = time()
        _logger.info('processed %d inserts... (%d seconds per batch)' % (i, end-start))
        start = time()
        entries = []

测量执行时间:

processed 1000 inserts... (16 seconds per batch)
processed 2000 inserts... (16 seconds per batch)
processed 3000 inserts... (17 seconds per batch)
processed 4000 inserts... (18 seconds per batch)
processed 5000 inserts... (18 seconds per batch)
processed 6000 inserts... (18 seconds per batch)
processed 7000 inserts... (19 seconds per batch)
processed 8000 inserts... (19 seconds per batch)
processed 9000 inserts... (20 seconds per batch)
等等,随着更多的插入,时间不断增长。使用Django设置DATABASES ['default'] ['ATOMIC_REQUESTS'] = True时,请求在事务内部运行,然而,将其关闭似乎没有任何影响。 DEBUG模式已关闭。

一些观察结果:

  • 当请求完成,并且我执行相同的请求时,测量的时间看起来非常相似:从相当低的开始,并从那里开始增长。请求之间没有进程重启。

  • 效果是一样的,无论我是使用serializer.save()还是bulk_create()进行单独插入。

  • bulk_create()行本身的执行时间大致相同,超过半秒。

  • 如果我完全删除插入,循环将在恒定时间执行,这指向db-connection层中发生的事情,随着插入量的增加,整个过程变慢... < / p>

  • 执行期间,Python进程的内存消耗在到达第一个bulk_create()之后几乎保持不变,Postgres进程内存也是如此,所以这看起来不是问题。

是什么让插入物变得更慢?由于新请求再次快速启动(无需重新启动进程),我可以在请求恢复速度期间执行某种清理吗?

3 个答案:

答案 0 :(得分:1)

我找到的唯一解决方案是在settings.py中禁用ATOMIC_REQUESTS,这允许我在请求期间不时调用db.connection.close()和db.connection.connect(),以保持执行成长的时间。

答案 1 :(得分:0)

if($_SESSION['userLogged'] == true) { echo '<p>Hello world!</p>'; } 是否在数据库级别有任何索引?可能是因为每次插入后更新会影响处理时间吗?

您可以尝试删除索引(如果有的话)并查看是否有任何改变。

答案 2 :(得分:0)

大免责声明:我还是新手......

从我在你的代码中看到的是 1000条目16秒 9000个条目20秒 对我来说,时间增加似乎是正常的事情,插入更多的条目需要更多的时间没有? 对不起,如果我误解了什么