2014-12-19 229 views
2

我在django模型中加載excel文件並使用xlrd讀取並在數據庫中存儲。 加載大約20k行花費1分鐘..但是我的文件有160k行花了8分鐘,所以我需要減少讀取和存儲的時間,以小於這種大容量文件的分鐘。我應該怎麼做才能減少加載時間。什麼是所有可能的方式?django批量excel文件讀取速度太慢使用xlrd

def upload_file(request): 
    if request.method == 'POST': 
     form = UploadFileForm(request.POST, request.FILES) 
     if form.is_valid(): 
      newdoc = Upload(file = request.FILES['file']) 
      newdoc.save() 
      xlbook = open_workbook(newdoc.file.name) 
      sheet = xlbook.sheet_by_index(0) 
      field = [sheet.cell_value(0,c) for c in range(sheet.ncols)] 
      temp = [sheet.cell_value(c,0) for c in range(sheet.nrows)] 
      value = [[sheet.cell_value(r,c) for c in range(sheet.ncols)]for r in range (sheet.nrows)] 
      data = {} 
      if request.POST.get('check'):  
       Sales.objects.filter(OrderID__in = temp[1:]).delete() 
      for n in range(0,sheet.nrows): 
       if n > 0: 
        list = value[n] 
        for i in range(0,len(field)): 
         data[field[i]] = list[i] 
       if data: 
        date_value = xldate_as_tuple(sheet.cell_value(n,1),xlbook.datemode) 
        data["Date"] = datetime(*date_value[:3]) 
        add = Sales.objects.get_or_create(**data) 
      return HttpResponseRedirect('/salesdata/') 
    if request.method == 'GET': 
     form = UploadFileForm(request.POST, request.FILES) 
    return render(request,'salesdata/upload.html', {'form': form}) 
+0

你的問題更多的是關於'xlrd'和更少關於'Django'的高效讀取。當然是 – Constantinius 2014-12-19 10:05:08

+0

,是的!但有沒有什麼包可以更快地讀取excel併爲django模型編寫代碼。 – 2014-12-19 10:27:17

回答

2

一,不要在視圖中做到這一點。用芹菜等開始後臺任務,然後返回。不要讓用戶等待。

其次,問題在於你對每一行都做了get_or_create;那很慢。您可以先創建未保存的Sales實例列表,然後使用Sales.objects.bulk_create創建它們。這樣一來,這是一個插入查詢,這將會快得多。

不幸的是,只有插入,它不會更新已經存在的數據。修復這個問題比我現在想要把這個答案放在更多的位置,最好的方法取決於與通常情況下的插入相比,有多少行會被更新。最糟糕的情況是,你確實必須爲每一行提供一個sql UPDATE,而且這樣做總是很慢。

+0

是否有其他包以更快的方式讀取excel?我需要一些批量上傳和讀取excel文件,應該有一些較小的複雜性。 – 2014-12-19 11:56:09

+0

我認爲你可以做得比xlrd更好,我總是覺得它很好。但正如我所說,我不認爲Excel的閱讀是你的速度問題,數據庫寫作是。 – RemcoGerlich 2014-12-19 11:58:15

+0

你可以建議將數據寫入Django模型或數據庫的方法.. ??我正在尋求一些不同的代碼來做到這一點。 – 2014-12-19 12:05:18