【发布时间】:2011-05-16 16:44:17
【问题描述】:
我计划使用 django 的 ORM 将从 ~750 个文件(每个 ~250MB)中提取的 10 亿条记录上传到数据库。 目前每个文件需要大约 20 分钟来处理,我想知道是否有任何方法可以加速这个过程。
我采取了以下措施:
- Use @transaction.commit_manually 并每 5000 条记录提交一次
- 设置 DEBUG=False 以便 django won't accumulate all the sql commands in memory
- 遍历单个文件中记录的循环完全包含在单个函数中(最小化堆栈更改)
- 避免访问数据库进行查询(使用数据库中已有对象的本地哈希instead of using get_or_create)
- Set force_insert=True in the save() 希望它能为 django 节省一些逻辑
- Explicitly set the id 希望它能为 django 节省一些逻辑
- 一般代码最小化和优化
我还能做些什么来加快速度?以下是我的一些想法:
- 使用某种更快的 Python 编译器或版本(Psyco?)
- Override the ORM and use SQL directly
- 使用一些可能更好的第 3 方代码(1、2)
- Beg the django community 创建一个 bulk_insert 函数
欢迎任何关于这些项目或任何其他想法的指针:)
【问题讨论】:
-
你也可以看看像 Pentaho Kettle 这样的 ETL 工具。
-
优化 python 的东西几乎肯定是一种浪费,因为你几乎所有的时间都花在了数据库调用上。优化 101,在您浪费时间尝试优化错误的事情之前,测量以了解您的程序时间的去向。最大的收获是使用批量插入查询。
-
我最近用 django 1.8.5 做了一些有趣的实验。我认为创建模型是最耗时的事情,当记录数达到 100 万时。幕后有许多看不见的 django 检查。我的解决方案是使用原始 SQL 和
cursor.executemany而不是bulk_create。就我而言,时间从 13 分钟缩短到 54 秒。 stackoverflow.com/questions/32805766/… -
@stanleyxu2005 真的吗?我虽然 Django 没有检查 bulk_create。这怎么可能,任何 Django 专家?
标签: django optimization orm bulkinsert