
Когда bottleneck не в БД: ускоряем генерацию Excel — отчетов в Go
ssharifzoda 10 минут назад Когда bottleneck не в БД: ускоряем генерацию Excel — отчетов в Go Средний 8 мин 222 Go * SQL * Microsoft Excel Кейс Всем доброго времени суток!Недавно пережитый опыт работы с отчетом хочу...
Anthropic — What company has the best second artificial intelligence model at the end of June?
В сфере искусственного интеллекта произошло заметное событие. ssharifzoda 10 минут назад Когда bottleneck не в БД: ускоряем генерацию Excel — отчетов в Go Средний 8 мин 222 Go * SQL * Microsoft Excel Кейс Всем доброго времени суток! Недавно пережитый опыт работы с отчетом хочу выставить на всеобщее обозрение, вдруг кому-то будет полезен. Чтобы не томить и сохранить более технический подход, давайте сразу начнем "разбор полёта".
В какой-то момент у нас появился вот такой запрос:выгрузить Excel-отчётоколо 150k строк данныхGo + excelizeобычный HTTP endpointSQL-запросы работали быстро. Индексы были в порядке. Памяти серверу хватало.
Технические детали
Но сам Excel-отчёт генерировался больше минуты. На локальной машине выгрузка занимала около 16 секунд. На тестовом сервере — 35-40 секунд, после чего nginx начинал отдавать 502 Bad Gateway.
Проблема оказалась совсем не там, где ожидалось. Bottleneck был:не в БДне в сетине в JSONа в генерации Excel. Причём основное время уходило не на запись данных, а на:стилиXML-сериализациюallocationsпостоянные вызовы SetCellStyleи создание тысяч объектов внутри циклов.
В статье покажу:почему наивная генерация Excel медленнаякак SetCellStyle убивает производительностьзачем нужен StreamWriterпочему StreamWriter ломает шаблоныкак совместить потоковую генерацию и Excel templateи почему большие Excel-экспорты лучше вообще выносить из HTTP lifecycle. Наивная реализацияПервое, с чего начинается любая задача подобного рода — это стандартный подход через excelize. NewFile() и последовательное заполнение ячеек.
Отраслевые последствия
На этом этапе всё выглядит абсолютно нормально: есть файл, есть цикл по данным, есть запись значений в ячейки. Пример упрощённой реализации выглядел примерно так:xlsx := excelize. NewFile() sheet := "Report" index, _ := xlsx.
NewSheet(sheet) xlsx. DeleteSheet("Sheet1 startRow := 4 for i, v := range На первый взгляд — ничего подозрительного. Обычный код, который делает ровно то, что ожидается: заполняет Excel-таблицу построчно.
Дальше добавляется оформление, потому что “без стилей Excel выглядит плохо”. И именно здесь начинается деградация производительности:xlsx. SetCellStyle(sheet, fmt.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





