Ответ
Основной bottleneck — неэффективная обработка больших объемов данных, ведущая к высокому потреблению памяти (OOM риски) и низкой производительности.
Проблема: Изначальная архитектура предполагала загрузку целых больших CSV-файлов (10+ ГБ) в память в виде List<String> для последующей обработки.
Недостатки такого подхода:
- Высокое потребление памяти (Heap Pressure).
- Долгое время старта обработки (ожидание полной загрузки файла).
- Последовательная, непараллельная обработка, не использующая возможности multi-core CPU.
- Массовые операции с БД без пагинации или batch-оптимизаций.
Предлагаемое решение — переход на потоковую (stream) обработку:
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;
try (Stream<String> lines = Files.lines(Paths.get("huge_dataset.csv"))) {
lines
.parallel() // Параллельная обработка для использования всех ядер
.skip(1) // Пропуск заголовка
.filter(line -> !line.trim().isEmpty())
.map(this::parseCsvLine) // Парсинг строки в объект
.forEach(this::saveToDatabaseBatch); // Пакетная вставка в БД
}
Дополнительные оптимизации:
- Batch-обработка запросов к БД (использование
addBatch()в JDBC илиsaveAll()в JPA). - Кэширование часто запрашиваемых справочных данных.
- Профилирование (через VisualVM или Async Profiler) для поиска конкретных точек торможения.