
# Tükeldamine

`DocStore` kirjutab iga kirje jaoks eraldi faili. Tükeldamiseta kuhjuksid suure kogumi kõik failid ühte kataloogi ning kataloogitoimingud aeglustuksid kirjete arvu kasvades. Seetõttu jagab storh kirjefailid ID kahe viimase märgi järgi ämbritesse:

```text
pages/data/2d/018bcfe5-6800-7000-8000-2d5dba6274da.jsonc
```

Ämbri valimiseks kasutatakse UUID viimase rühma algust (märgid 24 ja 25), mis sisaldab juhuslikku entroopiat. Kaks kuueteistkümnendsümbolit annavad 256 ämbrit, seega jääb 100 000 kirjega kogumis igas kataloogis keskmiselt alla 400 faili.

## Miks lõpuosa, mitte algus

UUIDv7 ID-d algavad 48-bitise millisekundilise ajatempliga, nii et lähestikku loodud ID-de algusmärgid on samad. Eesliite järgi tükeldamisel satuks iga kirjutushoog samasse ülekoormatud kataloogi ning ämbrid vahetuksid alles aja möödudes. Kirje lõpubaidid on juhuslikud, seega jaotuvad kirjutused algusest peale ühtlaselt.

Tükeldamine on lugemiste ja päringute eest varjatud: `get()` arvutab ämbri ID põhjal ning `stream()` tagastab kirjed ID järgi kõigi ämbrite lõikes sorteerituna, nii et kursoriga lehekülgjaotus toimib, nagu oleks kogu üks järjestatud loend.

## Suurema mahu korral

Ämbrite arv ei kasva: kaks kuueteistkümnendsümbolit annavad 256 kataloogi igas kogumis, olenemata selle suurusest. Kasvab failide arv ämbri kohta:

| Kirjeid | Faile ämbri kohta |
| ------- | ---------------- |
| 10k     | ~40              |
| 100k    | ~390             |
| 1M      | ~3,900           |
| 10M     | ~39,000          |

Tänapäevased failisüsteemid indekseerivad kataloogikirjeid, seega hoiavad paar tuhat faili salves üksikotsingud kiired; 1M kirjet sobib hästi `get()` ja indekseeritud päringute jaoks. Salve avamine võtab kogu suurusest sõltumata konstantse aja: mahajäänud ajutiste failide koristus käivitub ainult siis, kui aegunud kirjutaja märgis näitab, et eelmine protsess jooksis kirjutamise ajal kokku. Mahu kasvades muutuvad lineaarselt aeglasemaks kogu kollektsiooni toimingud: indekseerimata läbivaatused, `reindex()` ja `verify()` läbivad kõik iga kirje faili, seega käsitle neid paketttöödena. Kui kollektsioonis on üle umbes 10M kirje, hakkavad tähtsust omandama salvepõhised loendused ja inode’ide koguarv: jaga kollektsioon osadeks või kasuta läbivaatuspõhiste andmete jaoks segmenteeritud logi, mis hoiab failide arvu juba ehituselt väiksena.

## Teised mootorid

`SegmentedLog` ja `Queue` ei jaga andmeid osadeks, sest nad ei loo iga kirje jaoks eraldi faili. Logi lisab andmeid segmendifailidesse asukohas `segments/`, mille suurust piirab `max_segment_bytes` (vaikimisi 1 MiB), ja järjekord lisab sündmused ühteainsasse `queue.log`. Failide arv jääb juba ülesehituse tõttu väikeseks.
