perf: снизить память и время генерации SARIF (analyze) — #4248#4275
Conversation
…льтатов SarifReporter строил в памяти List<Result> (по одному Result на диагностику, на крупной конфигурации — миллионы) и целиком сериализовал дерево SarifSchema210 с INDENT_OUTPUT. Это создавало второй полный граф Result/Location/Region поверх уже вычисленных диагностик — главный источник пика памяти при генерации отчёта. Теперь отчёт пишется потоково через JsonGenerator: каркас + результаты по одному по мере обхода fileinfos, без промежуточного списка и без pretty-print. Плюс дедуп строк в createResult (uri считается один раз на файл, message — один раз). Замер (synthetic, 500k диагностик): время 27.8с->1.8с (15x), пик heap 1516->951 МБ (-37%), размер файла 666->429 МБ (-36%). Формат неизменен (readback-тест зелёный). См. #4248. Co-Authored-By: Claude Opus 4.8 <[email protected]>
…ых данных populateContext замораживает документы (freezeComputedData) ради переиспользования вторичных данных (сложность, метрики, данные подавления) в LSP-режиме. В пакетном анализе документ остаётся замороженным и в getFileInfoFromFile, поэтому финальный tryClearDocument не освобождает эти данные — они накапливаются на всю конфигурацию и в фазе анализа доводят RSS до OOM на крупных конфигурациях. После построения FileInfo эти данные больше не нужны (метрики уже захвачены в FileInfo, сложность репортёрам не требуется) — размораживаем документ перед tryClearDocument. Замер (реальный analyze на SSL 3.1, 2197 модулей, Typo off): max live-heap (used-after-GC) 2184->1819 МБ (-365 МБ, -17%) при неизменных диагностиках и времени. На конфигурации из issue масштабируется в гигабайты. См. #4248. Co-Authored-By: Claude Opus 4.8 <[email protected]>
|
Warning Review limit reached
Next review available in: 7 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
📝 WalkthroughWalkthroughBatch analysis now releases frozen document data after ChangesAnalysis reporting updates
Estimated code review effort: 3 (Moderate) | ~20 minutes Sequence Diagram(s)sequenceDiagram
participant SarifReporter
participant AnalysisInfo
participant JsonGenerator
SarifReporter->>JsonGenerator: Open output and write SARIF header
SarifReporter->>AnalysisInfo: Iterate files and diagnostics
AnalysisInfo-->>SarifReporter: Provide diagnostic data
SarifReporter->>JsonGenerator: Write each result immediately
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
По ревью: разница в размере файла была именно от pretty-print, а не от данных. Отступы возвращены через настройку маппера (JsonMapper.builder().enable(INDENT_OUTPUT)) — createGenerator применяет их и к потоковой записи. Стриминг сохранён: генератор пишет результаты по одному, память не растёт. Без отступов отчёт на миллионы результатов — одна строка в сотни МБ, которую не открыть в редакторе. См. #4248. Co-Authored-By: Claude Opus 4.8 <[email protected]>
Заморозка documentContext в populateContext — намеренная оптимизация: между populate и вычислением диагностик файл не меняется, поэтому ленивые построенные данные не пересчитываются (флаг влияет только на очистку). Фикс её НЕ отменяет — разморозка происходит только на финальном tryClearDocument, после того как getDiagnostics/getMetrics уже прочитаны и захвачены в FileInfo. Прежний комментарий вводил в заблуждение. См. #4248. Co-Authored-By: Claude Opus 4.8 <[email protected]>
|



Что и зачем
Issue #4248:
analyze -r sarifна крупной конфигурации (23090 файлов, ~1.5M диагностик) растёт до 14–16 ГБ RSS и не доживает до записи SARIF. Разбор выявил два наложенных источника памяти; PR устраняет оба.1.
perf(reporters): потоковая сериализация SARIFSarifReporterстроил в памятиList<Result>(по одномуResultна диагностику — на такой конфигурации миллионы) и целиком сериализовал деревоSarifSchema210сINDENT_OUTPUT. Это создавало второй полный графResult/Location/Region/Messageповерх уже вычисленных lsp4j-диагностик — главный источник пика памяти при генерации отчёта, плюс раздутый файл и медленная запись из-за pretty-print.Теперь отчёт пишется потоково через
JsonGenerator: каркас (tool/invocations/…) + результаты по одному по мере обходаfileinfos, без промежуточного списка и без отступов. Дополнительно — дедуп строк вcreateResult(uriодин раз на файл, текст сообщения один раз вместо двух).2.
perf(cli): разморозка документов вanalyzepopulateContextзамораживает документы (freezeComputedData) ради переиспользования вторичных данных (сложность, метрики, данные подавления) в LSP-режиме. В пакетном анализе документ остаётся замороженным и вgetFileInfoFromFile, поэтому финальныйtryClearDocumentне освобождает эти данные — они накапливаются на всю конфигурацию и в фазе анализа доводят RSS до OOM.После построения
FileInfoэти данные больше не нужны (метрики уже захвачены вFileInfo, сложность репортёрам не требуется) — размораживаем документ передtryClearDocument.Замеры
SARIF-репортёр (synthetic-харнесс, 500 000 диагностик):
→ 15× по времени, −37% пик, −36% файл. Ключевое: пик больше не масштабируется вторым деревом
Result.Фаза анализа (реальный
analyzeна SSL 3.1, 2197 модулей, Typo off,-Xmx4g):→ −365 МБ (−17%) удержанного heap при неизменных диагностиках и времени; на конфигурации из issue масштабируется в гигабайты.
Совместимость
Формат SARIF не изменился (кроме отступов) — существующий
SarifReporterTestчитает отчёт обратно вSarifSchema210и проходит.AnalyzeCommandTest(4/4) зелёный.Осталось за рамками
Стриминг-контракт всех репортёров (чтобы не копить все
FileInfo/диагностики вAnalysisInfo) — бо́льший рефакторинг, кандидат в отдельный issue.🤖 Generated with Claude Code
Summary by CodeRabbit