From f66bb52fecacd5cf9a6084d59d25e7fdc06fe2b6 Mon Sep 17 00:00:00 2001 From: Poulpe Date: Tue, 28 Apr 2026 15:06:09 +0000 Subject: [PATCH] perf(pipeline): in-memory cache for usv_track (warm: 20ms vs 1.8s cold) --- pipeline_runner/main.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pipeline_runner/main.py b/pipeline_runner/main.py index dafbed0..dfc11ba 100644 --- a/pipeline_runner/main.py +++ b/pipeline_runner/main.py @@ -201,9 +201,14 @@ def _read_usv_track(nav_log_path: Path, max_pts: int = 2000) -> list[dict]: return pts +_track_cache: dict[str, list[dict]] = {} + + @app.get("/sorties/{sortie_id:path}/usv_track") async def get_usv_track(sortie_id: str): """Return USV GPS track [{t_ms, lat, lon, heading, source}] for map polylines.""" + if sortie_id in _track_cache: + return JSONResponse(_track_cache[sortie_id]) raw_dir = OUTPUT_DIR / sortie_id / "raw" nav_logs = list(raw_dir.rglob("*_navigation_log.csv")) if raw_dir.exists() else [] if not nav_logs: @@ -212,4 +217,5 @@ async def get_usv_track(sortie_id: str): for nav_log in nav_logs: pts.extend(await asyncio.to_thread(_read_usv_track, nav_log)) pts.sort(key=lambda p: p["t_ms"]) + _track_cache[sortie_id] = pts return JSONResponse(pts)