2013-04-10 94 views
1

我有一个很大的CSV文件,我导入到Django。目前,如果我的数学是正确的,它将在32小时内完成!可以加速吗?加速CSV更新/导入Django模型

我有一个CSV文件,约157,000行15列。我将它读入我的Django模型并将其保存到MySQL数据库中。这里就是奇迹发生:

reader = csv.reader(csvFile, delimiter=',', quotechar='"') 
for row in reader: 
    tmpRecord = Employee(
     emp_id = row[0], # Primary Key 
     name = row[1], 
     # snipped for brevity; other columns assigned 
     group_abbr = row[14] 
    ) 

    pieces = string.split(tmpRecord.name.title(), " ") 
    newName = pieces[1] 
    try: 
     newName += " " + pieces[2] 
    except IndexError: 
     pass 
    newName += " " + pieces[0] 
    tmpRecord.name = newName 

    tmpRecord.save() 

的“作品”块是从“姓氏名字MIDDLE”取名字领域,使之成为“名字中姓”。

这将每月运行一次,用新员工更新数据库,并对现有员工记录进行任何更改。很多时候,现有记录不会改变,但任何一个(或多个)字段都可能会改变。是否有我可以添加的支票,花费更少的时间,然后在每条记录上拨打save()

目前,这需要每20个记录约15秒完成!有没有一种方法可以加速(大幅)?

UPDATE:

如果它的事项,该emp_id是表的主键。没有员工具有与以前员工相同的身份(包括退休员工)。

+0

你可能要添加的'@ commit_on_success'装饰,以避免数据库做每个'.save后隐式数据库提交()'。这可能会有所帮助。 (特别是在使用InnoDB的情况下。) – AKX 2013-04-10 19:47:38

+0

另外''string.split'已被弃用了很长一段时间。尝试类似'pieces = tmpRecord.name.title()。split(); tmpRecord.name =“”.join((件[1],件[2],件[0]))'为Pythonic方法。 – AKX 2013-04-10 19:49:49

+0

'@ commit_on_success'会放在函数'def'的上方吗? – 2013-04-10 20:10:21

回答

1

也许你可以使用你的Python脚本来准备一个中间加载CSV,然后尝试做一个加载操作呢?

http://dev.mysql.com/doc/refman/5.6/en/load-data.html

+0

这是我最终走过的路线。读取,修改和写入CSV导入对于速度非常合适。感谢您的建议。 – 2013-04-15 17:18:20

2

我认为bulk_create会帮你 https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.bulk_create

如果您有与已经在数据库中的数据持久化的问题。插入到其他表中,然后使用SQL查询修复您的问题。

+0

如果我尝试用已经存在的记录运行'bulk_create'会失败吗? – 2013-04-10 20:12:56

+0

如果您违反id或唯一约束,它必须失败。它可能取决于你的数据库后端 - 不确定关于sqlite。但我的意见是,当你手动设置ID你不想失去对发生的事情的控制。因此,请使用其他空表,然后使用SELECT INSERT合并数据库中的数据。 – singer 2013-04-10 20:49:33