# 🧹 Не держать весь журнал в памяти при пересборке

- **Тип:** chore
- **Категория:** Ядро
- **Зачем:** Учёт доставок и список путей архива материализуются целиком: расход растёт вместе с журналом, а у журнала конца нет
- **Теги:** goal:journal-and-rebuild

`healthlog reindex` материализует целиком две вещи: учёт доставок из базы и
список путей архива. На сегодняшнем объёме (сотня тел) это незаметно, на
квартальном (~12 тысяч) — терпимо, а дальше растёт линейно и без предела:
журнал по определению не подчищается до следующего проверенного экспорта.

Отдельно к этому примешивается **размер заголовков**: `MaxHeaderBytes` у
сервера не задан, то есть верхней границы у колонки `delivery.headers` нет
вовсе. Раздутый заголовок множится на число доставок.

Порог, за которым это перестаёт быть теорией, не измерен — с него и стоит
начинать, если задача берётся. Лечится потоковым перечислением журнала
(курсор по учёту, обход каталога партиями по суткам) вместо двух срезов в
памяти.

Сегодня недостижимо, поэтому приоритет низкий. Естественно склеивается с
[ретеншеном сырого архива](raw-archive-retention.md): та задача задаёт, где
у журнала конец, эта — как его читать, не поднимая целиком.

Готово, когда пересборка на журнале в десятки тысяч доставок идёт с потреблением
памяти, не зависящим от его длины.

Связано: `internal/replay`, `cmd/healthlog/reindex.go`.

Двигает строку «Завершения» цели: «Расход пересборки не растёт вместе с журналом».
