Ответ
Задача: Оптимизация обработки больших CSV-файлов (>1 ГБ) в Spring Boot приложении для устранения утечек памяти.
Проблема: Исходная реализация загружала весь файл в память (List<String> lines), что приводило к потреблению ~2 ГБ памяти и падению приложения.
Решение: Переход на потоковую (streaming) обработку с использованием Apache Commons CSV для построчного чтения.
try (Reader reader = Files.newBufferedReader(path);
CSVParser parser = CSVFormat.DEFAULT.parse(reader)) {
for (CSVRecord record : parser) {
processRecord(record); // Обработка одной записи
}
}
Результат:
- Память: Снижение потребления с ~2 ГБ до стабильных ~50 МБ.
- Производительность: Время обработки сократилось на 30% за счет исключения накладных расходов на полную загрузку и GC.
- Наблюдаемость: Добавлен мониторинг прогресса обработки через Micrometer метрики.