Товарищи/коллеги/други
Есть у меня давно тянущийся и обросший костылями по самое небалуй проект.
Появилась внезапно потребность выгружать строки в экселевский файл. Причем много строк, составных и все такое.
Выборка идет с select_related по самое немогу, так что обращений к базе немного, забирает что нужно.
А вот формирование файла...
И так делал по csv(просто и с эхом):
for o in orders:
rows.append([o.id,
u'%s' % o.get_o_type_display(),
u'%s' % o.o_number,
u'%s, Цвет: %s' % (o.canvas.f_name(), o.color.code) if o.o_type=='1' else u'%s, %s' % (o.part.name, o.part.get_units_display()),
u'%s, Цвет: %s' % (o.r_canvas.f_name(), o.r_color.code) if o.o_type=='1' else u'%s, %s' % (o.part.name, o.part.get_units_display()),
o.rest.id,
u'%s' % o.dealer,
u'%s' % o.dealer.city.name,
o.dealer.id,
u'%s' % o.warehouse,
o.amount,
o.perimetr if o.perimetr else u'-',
o.fix_price,
o.full_price,
o.cost,
u'%s' % o.calc_increase,
o.mat_cost,
u'%s' % o.owner,
o.entry_date.strftime("%Y-%m-%d"),
o.accept_date.strftime("%Y-%m-%d"),
o.in_prod_date.strftime("%Y-%m-%d"),
o.shipping_date.strftime("%Y-%m-%d"),
o.defect,
o.defect_return,
u'%s' % o.manager_memo,
u'%s' % o.dealer_memo,
u'%s' % o.warehouse_memo,
u'%s' % o.final_memo,
u'%s' % o.final_d_memo,])
pseudo_buffer = Echo()
writer = csv.writer(pseudo_buffer, delimiter=';',)
response = StreamingHttpResponse((writer.writerow(row) for row in rows), content_type="text/csv")
response['Content-Disposition'] = 'attachment; filename="all_the_orders.csv"'
return response
И так через xlsxwriter:
for o in orders:
sheet.write(i, 0, o.id)
sheet.write(i, 1, u'%s' % o.get_o_type_display())
sheet.write(i, 2, u'%s' % o.o_number)
if o.o_type == '1':
name = u'%s, Цвет: %s' % (o.canvas.f_name(), o.color.code)
sheet.write(i, 3, name)
name_2 = u'%s, Цвет: %s' % (o.r_canvas.f_name(), o.r_color.code)
sheet.write(i, 4, name_2)
else:
sheet.write(i, 3, u'%s, %s' % (o.part.name, o.part.get_units_display()))
sheet.write(i, 4, u'%s, %s' % (o.part.name, o.part.get_units_display()))
sheet.write(i, 5, o.rest.id)
sheet.write(i, 6, u'%s' % o.dealer)
sheet.write(i, 7, u'%s' % o.dealer.city.name)
sheet.write(i, 8, o.dealer.id)
sheet.write(i, 9, u'%s' % o.warehouse)
sheet.write(i, 10, o.amount, format1)
sheet.write(i, 11, o.perimetr, format1) if o.perimetr else sheet.write(i, 10, u'-')
sheet.write(i, 12, o.fix_price, format1)
sheet.write(i, 13, o.full_price, format1)
sheet.write(i, 14, o.cost, format1)
sheet.write(i, 15, u'%s' % o.calc_increase)
sheet.write(i, 16, o.mat_cost, format1)
sheet.write(i, 17, u'%s' % o.owner)
sheet.write(i, 18, o.entry_date.strftime("%Y-%m-%d"))
sheet.write(i, 19, o.accept_date.strftime("%Y-%m-%d"))
sheet.write(i, 20, o.in_prod_date.strftime("%Y-%m-%d"))
sheet.write(i, 21, o.shipping_date.strftime("%Y-%m-%d"))
sheet.write(i, 22, o.defect)
sheet.write(i, 23, o.defect_return)
sheet.write(i, 24, u'%s' % o.manager_memo)
sheet.write(i, 25, u'%s' % o.dealer_memo)
sheet.write(i, 26, u'%s' % o.warehouse_memo)
sheet.write(i, 27, u'%s' % o.final_memo)
sheet.write(i, 28, u'%s' % o.final_d_memo)
book.close()
output.seek(0)
response = HttpResponse(output.read(), content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
response['Content-Disposition'] = "attachment; filename=all_the_orders.xlsx"
return response
и все равно с ограничениями DO не справляется. Дроплет работает как 1 CPU/1 Gb. За минуту успевает обработать примерно 4000 строк. Причем неважно - что xlsx, что csv. Процесс длинный - не база, а именно уже Django работает.
Как ускорить этот комбайн? В какую сторону смотреть?