2014-12-19 1 views
2

Я загружаю файл excel в модель django и читаю его с помощью xlrd и сохраняю в базе данных. Требуется 1 минута, чтобы загрузить около 20 тыс. Строк .. но мой файл имеет 160 тыс. Строк, которые потребовались в течение 8 минут, поэтому мне нужно сократить время на чтение и хранение, чтобы быть меньше, чем мин для такого типа массового файла. Что делать, чтобы уменьшить время загрузки. какие все возможные способы?django bulk excel file read слишком медленно, используя 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

+0

, конечно же, да! но есть ли какой-либо пакет, который работает быстрее, читает excel и пишет для модели django. –

ответ

2

One, не делают это в целях. Запустите фоновое задание с сельдереем или так, затем вернитесь. Не оставляйте пользователя в ожидании.

Во-вторых, проблема в том, что вы делаете get_or_create для каждой строки; это медленно. Сначала вы можете составить список несохраненных экземпляров Sales, а затем создать их с помощью Sales.objects.bulk_create. Таким образом, это один запрос на вставку, который будет намного быстрее.

К сожалению, это только вставляет, оно не обновляет данные, которые уже есть. Исправлено это больше, чем я хочу поставить в этот ответ прямо сейчас, и лучший способ зависит от того, сколько строк будет обновлений по сравнению с вставками в обычном случае. В худшем случае вам действительно нужно иметь sql UPDATE для каждой строки, и это всегда будет медленным.

+0

Есть ли какой-либо другой пакет для чтения excel быстрее по-другому? Мне нужна некоторая пакетная загрузка и чтение файла excel, должно быть с меньшей сложностью. –

+0

Я не думаю, что вы можете сделать лучше, чем xlrd, я всегда находил, что это неплохо. Но, как я уже сказал, я не думаю, что чтение Excel - это ваша проблема с скоростью, в которой написана база данных. – RemcoGerlich

+0

Вы можете предложить метод записи данных в модель или базу данных django .. ?? Я прошу сделать несколько разных кодов. –