Ускорить формирование отчёта: обратный индекс маппинга, потоковые вложения, тесты прогресса #2
Loading…
x
Reference in New Issue
Block a user
No description provided.
Delete Branch "feat/1-report-perf"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #1 (частично — см. «Что осталось»).
Что сделано
app/pipeline/mapping.py,pick_rule_values_indexed). Раньше на каждую строку отчёта перебирались ~2 400 кандидатов путей (7 млн вызовов_pick_valueна 13 800 строк). Теперь индекс «путь → (правило, кандидат, проба)» строится один раз при импорте, а за строку проходим только по полям записи. Порядок кандидатов и проб сохранён;_pick_value/_pick_structured_valueостались как эталонная семантика, с которой индекс сверяетtests/unit/test_mapping_index.py(400 случайных payload + разобранный XML, все правила, все 4 источника).[n]минуют regex.getvalue()(main.py, тестtests/unit/test_main_attachments.py).d1daecd) закреплён smoke-тестами: колбэк вызывается ровно раз на XML-файл, включая нечитаемый.scripts/bench_report.py— воспроизводимый замер (--files,--ops,--profile).Замеры (230 файлов × 20 операций = 13 800 строк, Apple M, Python 3.13)
parser(доd1daecd)migrate_to_opencloudHEADНа проде умножайте на 8–12: серверное ядро плюс квота 0.25 CPU из
raisa_config.yml.Rulings I made
_pick_valueи_pick_structured_valueне удалены, а оставлены как эталон для дифференциального теста.test_mapping_lookup_cache.py) оставлены.gc.disable/freeze) замерена — выигрыша нет, не применяется.--profile blackчетыре чужих тестовых файла возвращены к исходному виду; в PR только файлы задачи.Что осталось (deferred)
process.log(размер/операций/разбор/запись на файл) после следующего прогона. Гипотезы: память у потолка 1 ГБ (tmpfs в /tmp, memory.high), разрыв websocket прокси._build_payload_lookup(5 построений на строку, ~25 % маппинга) и xlsxwriter (~35 % строки).🤖 Generated with Claude Code