我在django模型中加载excel文件并使用xlrd读取它并存储在数据库中。 加载大约20k行需要1分钟..但是我的文件有160k行需要花费8分钟,因此我需要将读取和存储的时间缩短到这种批量文件的时间不到一分钟。我该怎么做才能减少加载时间。有什么可能的方法?
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 :(得分:2)
一,不在视图中执行此操作。用Celery左右开始后台任务,然后返回。不要让用户等待。
其次,问题是你每行都在做get_or_create
;那很慢。您可以先创建未保存的Sales
实例列表,然后使用Sales.objects.bulk_create
创建它们。这样它就是一个插入查询,速度会快得多。
不幸的是,只有插入,它不会更新已存在的数据。修复这个问题比我现在想要的更多,最好的方法取决于通常情况下与插入相比有多少行更新。最糟糕的情况是,你确实必须为每一行都有一个sql UPDATE,而且总是很慢。