Назад к вопросам
Senior
7
Как минимизировать нагрузку на память бэкенда при чтении данных из БД, группировке и отправке файла на фронт?
Компании, где спрашивали
ЦифровыеПривычки
Ответ от нейросети
sobes.tech AI
Чтобы минимизировать нагрузку на память бэкенда при чтении данных из БД, группировке и отправке файла на фронт, можно использовать следующие подходы:
- Постраничная загрузка (pagination) — не загружать все данные сразу, а получать их порциями.
- Потоковая обработка (streaming) — читать и обрабатывать данные по частям, не загружая весь набор в память.
- Группировка на уровне БД — выполнять агрегации и группировки в запросах SQL, чтобы уменьшить объем передаваемых данных.
- Генерация файла на лету — формировать файл по частям и отправлять его клиенту через поток, не сохраняя весь файл в памяти.
Пример на Java с использованием JDBC и потоковой записи CSV:
try (Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement("SELECT category, COUNT(*) FROM items GROUP BY category");
ResultSet rs = ps.executeQuery();
ServletOutputStream out = response.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out))) {
response.setContentType("text/csv");
response.setHeader("Content-Disposition", "attachment; filename=report.csv");
writer.write("Category,Count\n");
while (rs.next()) {
String category = rs.getString(1);
int count = rs.getInt(2);
writer.write(category + "," + count + "\n");
writer.flush(); // отправляем данные по частям
}
}
Такой подход позволяет не держать в памяти весь результат и файл целиком, снижая нагрузку на память.