2014-12-19 228 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