# 034 — 작은 값은 인라인, 큰 값은 페이지로 저장 2026-09-24. [033](033-paged-document-storage.md)의 페이지 전용 실험은 1 MiB 문서의 1 B 수정을 줄였지만 1 B 문서의 수정 요청량을 25 B에서 16,440 B로 늘렸다. 이번에는 같은 문서 앱의 **선택형** 저장소에서 16 KiB 이하의 값은 기존 `PUREB001` 파일에 직접 담고, 그보다 큰 값만 `PUREP001` 페이지 루트로 표현한다. 실행 코어, 기본 `store.c`, 기본 패키지는 변경하지 않았다. [`store-paged.c`](../../prototypes/connections/store-paged.c)는 두 형식을 읽고, 결과 길이에 따라 다음 루트 형식을 고른다. 크기 경계를 넘을 때는 이전 형식의 논리 바이트를 읽어 새 파일을 완성한 후 공개한다. 페이지 저장 중 길이가 같은 부분 수정은 기존처럼 변경된 페이지만 추가한다. 형식 전환과 인라인 수정에도 기존 버전 충돌, 이전 읽기 스냅샷, 공개 전 실패와 공개 후 `PURE_UNCERTAIN` 계약을 적용한다. [단위 검사](../../prototypes/connections/results/2026-09-24-hybrid-storage-v2/unit.json)는 양방향 16 KiB 경계 전환, 기존 큰 `PUREB001` 파일의 첫 수정, 오래된 읽기, 크래시·충돌·혼합 편집을 포함한다. [ASan·UBSan 검사](../../prototypes/connections/results/2026-09-24-hybrid-storage-v2/unit-asan.json)도 통과했다. ## 실제 비용과 마이크로 경계 같은 `editor.pure` CLI가 문서를 만들고 1 B를 바꿀 때, `strace`에서 객체 파일에 성공한 사용자 공간 `write` 요청만 합산했다. 물리 디스크 쓰기량, 저널, 디렉터리 동기화와 지연 시간은 포함하지 않는다. | 작업 | 기본 불변 파일 | 선택형 하이브리드 | |---|---:|---:| | 1 MiB 마지막 1 B 교체 | 1,048,600 B / 258회 | 16,944 B / 3회 | | 1 B 문서의 1 B 교체 | 25 B / 2회 | 25 B / 2회 | [원본 쓰기 추적](../../prototypes/connections/results/2026-09-24-hybrid-storage-v2/write-cost.json). 큰 문서의 약 61.9배 적은 요청 바이트와 작은 문서의 동일한 요청량을 확인했다. 256개의 다른 파일이 있는 저장 디렉터리에서도 작은 값의 수정은 디렉터리 항목을 훑는 `getdents64` 호출이 없었다. [작은 값 경로 추적](../../prototypes/connections/results/2026-09-24-hybrid-storage-v2/small-scan.json). 단, 기존 큰 `PUREB001` 문서를 처음 수정할 때는 전체를 페이지 파일로 옮겨 써야 한다. 그 한 번의 전환 비용과 이후 수정의 총 지연·처리량은 아직 측정하지 않았으므로 더 빠른 저장소라는 결론은 내리지 않는다. 코드 비용도 늘었다. 같은 Linux AArch64/GCC 14 `-O2` 빌드에서 기본 CLI의 링크된 `text`는 35,807 B, 하이브리드 CLI는 **41,064 B**로 5,257 B 더 크다. 페이지 전용 실험의 39,960 B보다도 1,104 B 늘었다. 기존 선택형 페이지 예산인 40,960 B를 104 B 초과했다. 그래서 실패한 예산을 자동으로 통과시킨 것이 아니라 [별도의 42 KiB 연구 상한](../../prototypes/connections/hybrid-budget.json)을 명시했다. [코드·직접 의존성 결과](../../prototypes/connections/results/2026-09-24-hybrid-storage-v2/profile.json)는 CLI와 HTTP 모두 libc만 직접 필요함을 확인한다. 1 MiB 새 문서 편집 CLI의 피크 RSS는 **2,080 KiB**이며 기존 4 MiB 회귀 상한을 통과했다. [프로세스 메모리 결과](../../prototypes/connections/results/2026-09-24-hybrid-storage-v2/memory.json). 이 상한은 파일시스템 캐시, 동시 작업, 선택형 UI와 TLS를 포함하지 않는다. ## 앱과 배포 경계 [CLI·HTTP 전체 검사](../../prototypes/connections/results/2026-09-24-hybrid-storage-v2/app-release.json), [앱 ASan·UBSan 검사](../../prototypes/connections/results/2026-09-24-hybrid-storage-v2/app-asan.json), [인증 TLS 문서 피어](../../prototypes/connections/results/2026-09-24-hybrid-storage-v2/peer.json), [GTK 문서·정의 편집](../../prototypes/connections/results/2026-09-24-hybrid-storage-v2/gtk-flow.json)을 같은 저장 경로로 통과했다. GTK 큰 문서 창은 43,632 KiB RSS로, 이 실험이 선택형 UI의 메모리 문제를 해결하지는 않는다. [CLI만 든 선택형 묶음](../../prototypes/connections/results/2026-09-24-hybrid-storage-v2/pure-document-hybrid-micro-linux-aarch64.tar.gz)은 26,045 B이고, [HTTP·TLS·GTK까지 선택한 묶음](../../prototypes/connections/results/2026-09-24-hybrid-storage-v2/pure-document-hybrid-authoring-linux-aarch64.tar.gz)은 114,025 B다. 각각 다른 디렉터리에 풀어 [CLI와 양쪽 저장 형식](../../prototypes/connections/results/2026-09-24-hybrid-storage-v2/package-micro.json), [전체 앱 경로](../../prototypes/connections/results/2026-09-24-hybrid-storage-v2/package-full.json)를 다시 확인했다. 시스템 공유 라이브러리는 묶음에 포함되지 않는다. 작은 기존 `PUREB001` 파일은 그대로 사용할 수 있고, 큰 기존 파일도 읽고 수정하면서 `PUREP001`로 전환할 수 있다. **기본 저장기는 전환된 큰 파일을 읽을 수 없다.** 따라서 이 선택형 묶음에는 별도 저장 디렉터리를 사용해야 한다. 16 KiB OS 페이지를 요구하며 macOS는 검증하지 않았다. 큰 동시 작업, 세대 수거의 최악 지연, 실제 장치 쓰기량 및 운영 중 되돌리기 절차는 남아 있다. 작은 값만 계속 수정하는 경로에서는 디렉터리 스캔을 피하므로, 크래시가 남긴 임시 루트 파일도 다음 페이지 관련 작업 전까지 남을 수 있다. 이 비용과 제한 때문에 기본 마이크로 런타임에 포함하지 않는다. 재현 명령은 `make -C prototypes/connections check-hybrid`와 `python3 prototypes/connections/check_write_cost.py --flat prototypes/connections/build/pure-edit --candidate prototypes/connections/build/hybrid/pure-edit --candidate-mode hybrid`다.