django批量excel文件读取使用xlrd太慢

我在Django模型中加载excel文件,并使用xlrd读取并存储在数据库中。 加载大约20k行花费1分钟..但是我的文件有160k行花了8分钟,所以我需要减less读取和存储的时间less于一分钟这种大容量文件。 我应该怎么做,以减less加载时间。 什么是所有可能的方式?

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}) 

一, 不要这样做 。 用芹菜等开始后台任务,然后返回。 不要让用户等待。

其次,问题是你正在为每一行做一个get_or_create ; 那很慢。 您可以先创build未保存的Sales实例列表,然后使用Sales.objects.bulk_create创build它们。 这样,这是一个插入查询,这将快得多。

不幸的是,只有插入,它不会更新已经存在的数据。 解决这个问题比我想要的更多,最好的方法是取决于在通常情况下插入的行数是多less。 最糟糕的情况是,你真的必须有一个SQL UPDATE每一行,这将始终是缓慢的。