fix(objective parser): wrap bytes-iter in file-like reader for ijson #318

Merged
lekss361 merged 2 commits from fix/obj-ijson-bytes-iter-adapter into main 2026-05-17 17:52:56 +00:00

2 commits

Author SHA1 Message Date
lekss361
c8ac1fa732 fix(objective parser): restore bulk executemany in stream _flush
Reviewer flagged perf regression vs PR #315 — _flush loop'ил per-row
через db.execute(stmt, dict) вместо bulk db.execute(stmt, list).
Для 324k лотов это 648k round-trips × 2 sync/неделю.

Восстановлен SQLAlchemy executemany через list[dict] + commit
cadence 5 batch (2500 строк) как в #315.

Также убран неиспользуемый импорт datetime (ruff F401).

Per #318 (comment)
2026-05-17 20:48:27 +03:00
lekss361
8d0e67d03b fix(objective parser): wrap bytes-iter in file-like reader for ijson
ijson.items() ожидает file-like с .read(n), а resp.iter_bytes(65536)
возвращает generator bytes → ijson интерпретирует chunks как
(prefix, event, value) tuples → ValueError "too many values to unpack
(expected 3, got 65536)".

Добавлен _IterBytesReader адаптер: собирает chunks в bytearray buffer
и отдаёт через .read(n). Добавлена parse_lots_pf_stream — streaming-
вариант парсера для больших ответов (>100 МБ) через ijson.items(),
с автоматической обёрткой stream если у него нет .read.

Glitchtip BACKEND-1K (release 389e141, 3 events) — silent fail в
inner try/except → rows_extracted=NULL, lots=0 после "успешных" runs.
2026-05-17 19:58:59 +03:00