perf(826-2): 자재 한 줄 저장 15 초 → 1 초 · 기계 읽기 한 번에 풂
- Store_Make.save 새 키 찾기 = 3만 키 목록 훑기(제곱) → 묶음 - 기계 상세 = 판만 읽음(표 두 번 풀기 걷음) · 기계 폴더 새 사본 = 줄 글을 이어 한 번에 풂(표 열기 옛 한 파일과 비슷) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -249,7 +249,7 @@ def row(key: str) -> dict:
|
||||
r = next((x for x in _rows() if x.get("키") == key), None)
|
||||
if r is None:
|
||||
raise store.StoreError(404, f"없는 기계 「{key}」")
|
||||
return {"version": store.read(FILE)[1], "row": r}
|
||||
return {"version": store.version(FILE), "row": r} # 판만(826-2)
|
||||
|
||||
|
||||
# ── 저장 전 손질(`Store_Make.save` 가 부름) ──────────────────────────
|
||||
|
||||
@@ -307,7 +307,7 @@ def save(batch: list[dict], confirmed: bool = False) -> dict:
|
||||
_make_file()
|
||||
fresh = True
|
||||
part["version"] = part.get("version") or store.read(OWN)[1]
|
||||
before = {p["file"]: _file_keys(p["file"]) for p in batch}
|
||||
before = {p["file"]: set(_file_keys(p["file"])) for p in batch} # 자재 3만 키 — 목록 찾기 금지
|
||||
try:
|
||||
files = store.save(batch)
|
||||
except store.StoreError:
|
||||
|
||||
@@ -60,15 +60,17 @@ def _read(entry: os.DirEntry) -> tuple[bytes, object]:
|
||||
|
||||
|
||||
def _parts(folder: Path, shared: bool, parse=_parse) -> tuple[list[bytes], dict, list]:
|
||||
raws, head, rows = [], {}, []
|
||||
raws, head, rows, fresh = [], {}, [], []
|
||||
for entry in _entries(folder):
|
||||
raw, data = _read(entry)
|
||||
data = data if shared else parse(raw)
|
||||
raws.append(entry.name.encode() + b"\0" + raw)
|
||||
if entry.name == HEAD:
|
||||
head = data
|
||||
head = data if shared else parse(raw)
|
||||
elif not entry.name.startswith("_"):
|
||||
rows.append(data)
|
||||
fresh.append(raw)
|
||||
if not shared: # 새 사본 — 한 번에 풂(줄마다 풀기보다 빠름)
|
||||
rows = parse(b"[" + b",".join(fresh) + b"]")
|
||||
return raws, head, rows
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user