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

标签 python django excel xlrd

我正在 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})

最佳答案

第一,不要在 View 中执行此操作。用 Celery 等启动后台任务,然后返回。不要让用户等待。

其次,问题是您正在为每一行执行get_or_create;那很慢。您可以先列出未保存的 Sales 实例,然后使用 Sales.objects.bulk_create 创建它们。这样一来,它就是一个插入查询,速度会快很多。

不幸的是,这只执行插入操作,不会更新已有的数据。修复这个问题超出了我现在想要放入这个答案的范围,最好的方法取决于与通常情况下的插入相比,有多少行将被更新。最坏的情况是,您确实必须对每一行进行 sql UPDATE,而且速度总是很慢。

关于python - django使用xlrd读取批量excel文件太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27563608/

相关文章:

python - 使用 pandas 仅显示 Excel writer 输出中的筛选行

python - 使用额外功能处理错误

python - 操作系统错误 : [Errno 8] Exec format error when running subprocess. 打开

django - 在 Nginx 配置中设置自定义 header 并将其传递给 gunicorn

excel - 运行时跳过空白 "For loop"

excel - 使用标准 : Date & String & Empty Cells 计数单元格公式

python - 在 Python 中计算 Set 中已删除的项目

python - 如何从django模型中on_delete的SET值访问请求参数

python - 我可以使用 python os.nice 来降低 celery 任务的友好度吗?

PHPExcel - 如何将边框应用于从 mysql 数据加载的动态单元格范围