Senior
Hoe minimaliseer je de geheugenbelasting van de backend bij het lezen van gegevens uit de database, groeperen en het verzenden van een bestand naar de frontend?
sobes.tech AI
Antwoord van 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(); // отправляем данные по частям
}
}
Такой подход позволяет не держать в памяти весь результат и файл целиком, снижая нагрузку на память.