
# Skaidymas į dalis

`DocStore` kiekvienam įrašui sukuria po vieną failą. Neskirsčius į dalis, didelėje kolekcijoje visi failai būtų viename kataloge, o didėjant įrašų skaičiui katalogo operacijos lėtėtų. Todėl storh įrašų failus suskirsto pagal du įrašo ID simbolius:

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

Katalogas parenkamas pagal paskutinės UUID grupės pradžią (24-ąjį ir 25-ąjį simbolius), kuriuose yra atsitiktinių duomenų. Du šešioliktainiai simboliai sudaro 256 katalogų, todėl 100k įrašų kolekcijoje vidutiniškai viename kataloge bus mažiau nei 400 failų.

## Kodėl naudojami galiniai, o ne pradiniai simboliai

UUIDv7 ID prasideda 48 bitų laiko žyma milisekundžių tikslumu, todėl panašiu metu sukurti ID turi bendrų pradinių simbolių. Skaidant pagal pradžią, kiekvienas įrašų antplūdis patektų į tą patį intensyviai naudojamą katalogą, o katalogai keistųsi tik bėgant laikui. Įrašo galiniai baitai kiekviename įraše atsitiktiniai, todėl įrašai tolygiai paskirstomi iškart nuo pirmojo.

Skaidymas į dalis skaitymo ir užklausų veikimo nekeičia: `get()` pagal ID apskaičiuoja katalogą, o `stream()` grąžina įrašus, surikiuotus pagal ID visuose kataloguose, todėl puslapiavimas pagal žymeklius veikia taip, lyg kolekcija būtų vienas surikiuotas sąrašas.

## Didėjant apimčiai

Katalogų skaičius niekada nedidėja: du šešioliktainiai simboliai reiškia 256 katalogų, nepriklausomai nuo kolekcijos dydžio. Daugėja failų kiekviename kataloge:

| Įrašai | Failų kataloge |
| ------- | ---------------- |
| 10k     | ~40              |
| 100k    | ~390             |
| 1M      | ~3,900           |
| 10M     | ~39,000          |

Šiuolaikinės failų sistemos indeksuoja katalogų įrašus, todėl keli tūkstančiai failų kataloge leidžia greitai rasti įrašus pagal ID; 1M įrašų apimtis patogi naudojant `get()` ir indeksuotas užklausas. Saugyklos atidarymas trunka tiek pat laiko nepriklausomai nuo kolekcijos dydžio: našlaičių laikinųjų failų paieška vykdoma tik tada, kai paliktas neveikiančio rašytojo žymeklis rodo, kad ankstesnis procesas užstrigo rašydamas. Didėjant apimčiai tiesiškai ilgėja visos kolekcijos operacijos: neindeksuoti skenavimai, `reindex()` ir `verify()` peržiūri kiekvieną įrašo failą, todėl šias operacijas laikykite paketinėmis užduotimis. Kai kolekcijoje yra daugiau nei maždaug 10M įrašų, ima rūpėti failų skaičius kataloge ir bendras inode naudojimas: skaidykite kolekcijas arba naudokite segmentuotą žurnalą duomenims, kurie skenuojami, nes taip failų skaičius išlieka nedidelis.

## Kiti varikliai

`SegmentedLog` ir `Queue` neskirsto duomenų į dalis, nes nekuriamas atskiras failas kiekvienam įrašui. Žurnalas prideda įrašus į segmentų failus kataloge `segments/`, kurių dydį riboja `max_segment_bytes` (pagal numatytuosius nustatymus – 1 MiB), o eilė prideda įvykius į vieną `queue.log`. Todėl failų skaičius išlieka nedidelis.
