我计划使用 django 的 ORM 将从约 750 个文件(每个约 250MB)中获取的 10 亿条记录上传到数据库。
目前每个文件需要大约 20 分钟来处理,我想知道是否有任何方法可以加速这个过程。
我采取了以下措施:
-
使用@transaction.commit_manually https://stackoverflow.com/questions/1136106/efficent-way-to-insert-thousands-of-records-into-a-table-sqlite-python-django每 5000 条记录提交一次
- 设置 DEBUG=False 以便 django不会将所有sql命令累积在内存中 https://stackoverflow.com/questions/4292963/python-process-keeps-growing-in-django-db-upload-script
- 对单个文件中的记录运行的循环完全包含在单个函数中(最小化堆栈更改)
- 避免访问数据库进行查询(使用数据库中已有对象的本地哈希而不是使用 get_or_create https://stackoverflow.com/questions/2252530/efficent-way-to-bulk-insert-with-get-or-create-in-django-sql-python-django)
-
在save()中设置force_insert=True http://docs.djangoproject.com/en/dev/ref/models/instances/#forcing-an-insert-or-update希望它能节省 django 的一些逻辑
-
明确设置id http://docs.djangoproject.com/en/dev/ref/models/instances/#explicitly-specifying-auto-primary-key-values希望它能节省 django 的一些逻辑
- 通用代码最小化和优化
我还能做些什么来加快速度?以下是我的一些想法:
- 使用某种更快的Python编译器或版本(Psyco?)
- 重写ORM并直接使用SQL https://stackoverflow.com/questions/2252530/efficent-way-to-bulk-insert-with-get-or-create-in-django-sql-python-django
- 使用一些可能更好的第三方代码(1 http://code.google.com/p/django-batchimport/, 2 http://djangosnippets.org/snippets/446/)
-
请求 django 社区 http://code.djangoproject.com/ticket/661创建一个bulk_insert函数
欢迎任何有关这些项目或任何其他想法的指示:)
Django 1.4 提供了bulk_create()
QuerySet 对象上的方法,请参阅:
- https://docs.djangoproject.com/en/stable/ref/models/querysets/#django.db.models.query.QuerySet.bulk_create https://docs.djangoproject.com/en/stable/ref/models/querysets/#django.db.models.query.QuerySet.bulk_create
- https://docs.djangoproject.com/en/stable/releases/1.4/ https://docs.djangoproject.com/en/stable/releases/1.4/
- https://code.djangoproject.com/ticket/7596 https://code.djangoproject.com/ticket/7596
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)