#python #mysql #django #excel #django-queryset
Вопрос:
У меня есть около 10 тысяч файлов xlxs (каждый с 4 разными листами и одинаковым форматом данных для всех листов). Я хотел получить эти данные и добавить их в таблицы MySQL. С моим текущим кодом это занимает около 1-2 часов. для извлечения и заполнения данных. Я хотел оптимизировать это и сократить время примерно до 5-10 минут для 10 тыс. файлов. Пожалуйста, предложите мне правильное решение. ТИА.
class ImportFileView(APIView): def post(self,request): xlsx_file = request.FILES.getlist('file') # Around 10k files for file in xlsx_file: wb_obj = openpyxl.load_workbook(file) working_sheet = wb_obj['Sheet1'] create_table_one = TableOne.objects.create( id = working_sheet['B1'].value, first_name = working_sheet['B2'].value, last_name = working_sheet['B3'].value, country = working_sheet['B4'].value, region = working_sheet['B5'].value, lab = working_sheet['B6'].value, sample_date = working_sheet['B7'].value, issue_date = working_sheet['B8'].value, release_year = working_sheet['B9'].value, comments = working_sheet['B10'].value, ) create_table_one.save() for col in range(2,4): group = working_sheet[get_column_letter(col) str(11)].value name = working_sheet[get_column_letter(col) str(12)].value unit = working_sheet[get_column_letter(col) str(13)].value sample_unit = working_sheet[get_column_letter(col) str(14)].value parameter = working_sheet[get_column_letter(col) str(15)].value type = working_sheet[get_column_letter(col) str(16)].value default_value = working_sheet[get_column_letter(col) str(17)].value for row in range(19,90): create_data = TableData.objects.create( id = create_table_one.id, temperature = working_sheet['A' str(row)].value, group = group, name = name, unit = unit, sample_unit = sample_unit, parameter = parameter, type = type, default_value = default_value, actual_value = working_sheet[get_column_letter(col) str(row)].value ) create_data.save() working_sheet = wb_obj['Sheet2'] for col in range(2,100): if working_sheet[get_column_letter(col) str(5)].value == None or working_sheet[get_column_letter(col) str(5)].value == "": break group = working_sheet[get_column_letter(col) str(5)].value name = working_sheet[get_column_letter(col) str(6)].value unit = working_sheet[get_column_letter(col) str(7)].value sample_unit = working_sheet[get_column_letter(col) str(8)].value parameter = working_sheet[get_column_letter(col) str(9)].value type = working_sheet[get_column_letter(col) str(10)].value default_value = working_sheet[get_column_letter(col) str(11)].value for row in range(13,83): actual_value = working_sheet[get_column_letter(col) str(row)].value create_property_table = TableProperties.objects.create( id = create_assay.id, temperature = working_sheet['A' str(row)].value, group = property_group, name = property_name, unit = unit, sample_unit= sample_unit, parameter = parameter, type = type, default_value = default_value, actual_value = actual_value ) create_property_table.save() working_sheet = wb_obj['Sheet3'] for row in range(3,83): create_crude_data = TableCrudeData.objects.create( id = create_table_one.id, component = working_sheet['A' str(row)].value, pcnt = working_sheet['B' str(row)].value ) create_crude_data.save() working_sheet = wb_obj['Sheet4'] for row in range(2,67): create_properties = TablePropertiesTwo.objects.create( id = create_table_one.id, group = working_sheet[get_column_letter(1) str(row)].value, name = working_sheet[get_column_letter(2) str(row)].value, unit = working_sheet[get_column_letter(3) str(row)].value, sample_unit = working_sheet[get_column_letter(4) str(row)].value, parameter = working_sheet[get_column_letter(5) str(row)].value, type = working_sheet[get_column_letter(6) str(row)].value, default_value = working_sheet[get_column_letter(7) str(row)].value, actual_value = working_sheet[get_column_letter(8) str(row)].value ) create_properties.save() return Response({ 'success' : True })
Комментарии:
1. Так что просто для уверенности: вы отправляете один 1-2-часовой почтовый вызов в Django, где он почему-то не совпадает по времени и загружает/обрабатывает 10 тыс. документов? Что произойдет, если предпоследний сломается? Это звучит как плохой дизайн, и я бы искал асинхронные способы сделать это. Потенциально разделение нагрузки и параллельное выполнение задач (при условии, что серверная часть может справиться с этим).
2. Разве вам не нужно небольшое количество столов вместо 10 тысяч столов?
3. Являются
INSERTs
ли «упакованные» каким-то образом? (Я не вижу этих деталей в коде.)