2013-04-10 85 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