Sobes.tech
Back to questions
Senior
6

Как минимизировать нагрузку на память бэкенда при чтении данных из БД, группировке и отправке файла на фронт?

Companies where asked
ЦифровыеПривычки

Answer from AI

sobes.tech AI

Чтобы минимизировать нагрузку на память бэкенда при чтении данных из БД, группировке и отправке файла на фронт, можно использовать следующие подходы:

  1. Постраничная загрузка (pagination) — не загружать все данные сразу, а получать их порциями.
  2. Потоковая обработка (streaming) — читать и обрабатывать данные по частям, не загружая весь набор в память.
  3. Группировка на уровне БД — выполнять агрегации и группировки в запросах SQL, чтобы уменьшить объем передаваемых данных.
  4. Генерация файла на лету — формировать файл по частям и отправлять его клиенту через поток, не сохраняя весь файл в памяти.

Пример на 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(); // отправляем данные по частям
    }
}

Такой подход позволяет не держать в памяти весь результат и файл целиком, снижая нагрузку на память.