Sobes.tech
Senior

Cum se minimizează încărcarea memoriei backend-ului la citirea datelor din baza de date, gruparea și trimiterea unui fișier către frontend?

sobes.tech AI

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

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