
# Delenie na časti

`DocStore` zapisuje jeden súbor pre každý záznam. Bez delenia by sa pri veľkej kolekcii
všetky súbory hromadili v jednom adresári a operácie s adresárom by sa spomaľovali s rastúcim počtom položiek. Preto storh rozdeľuje súbory záznamov do priečinkov podľa dvoch znakov z ID záznamu:

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

Priečinok sa určuje podľa začiatku UUID poslednej skupiny (znaky 24
a 25), ktorá obsahuje náhodnú entropiu. Dva hexadecimálne znaky dávajú 256 priečinkov, takže v kolekcii so 100-tisíc záznamami pripadá v priemere menej než 400 súborov na adresár.

## Prečo koniec a nie začiatok

ID UUIDv7 sa začínajú 48-bitovou časovou pečiatkou v milisekundách, takže ID vytvorené krátko po sebe majú spoločné úvodné znaky. Delenie podľa predpony by posielalo každú vlnu zápisov do toho istého vyťaženého adresára a priečinky by sa menili až postupom času. Koncové bajty sú pre každý záznam náhodné, preto sa zápisy rovnomerne rozložia už od prvého záznamu.

Delenie je pri čítaní a dotazoch neviditeľné: `get()` vypočíta priečinok podľa ID a `stream()` vracia záznamy zoradené podľa ID naprieč všetkými priečinkami, takže stránkovanie kurzorom sa správa, akoby kolekcia tvorila jeden zoradený zoznam.

## Vo veľkom meradle

Počet priečinkov sa nikdy nezvyšuje: dva hexadecimálne znaky znamenajú 256 adresárov bez ohľadu na veľkosť kolekcie. Zvyšuje sa počet súborov v jednotlivých priečinkoch:

| Záznamy | Súbory na priečinok |
| ------- | ---------------- |
| 10k     | ~40              |
| 100k    | ~390             |
| 1M      | ~3,900           |
| 10M     | ~39,000          |

Moderné súborové systémy indexujú položky adresárov, takže niekoľko tisíc súborov v priečinku umožňuje rýchle vyhľadanie konkrétneho záznamu; milión záznamov bez problémov zvládajú `get()` a indexované dotazy. Otvorenie úložiska trvá konštantný čas bez ohľadu na veľkosť kolekcie: osirelé dočasné súbory sa vyhľadávajú a odstraňujú iba vtedy, keď značka neaktívneho zapisovača signalizuje, že predchádzajúci proces spadol počas zápisu. S rastom sa predlžujú operácie nad celou kolekciou: neindexované skenovania, `reindex()` a `verify()` prechádzajú všetky súbory záznamov, preto ich plánujte ako dávkové úlohy. Pri viac než približne 10 miliónoch záznamov v kolekcii začína záležať na počte záznamov v jednotlivých priečinkoch aj na celkovom využití inode: rozdeľte kolekcie alebo použite segmentovaný denník pre údaje určené na skenovanie, ktorý už svojím návrhom udržiava nízky počet súborov.

## Ostatné moduly

`SegmentedLog` a `Queue` nerozdeľujú údaje na časti, pretože nevytvárajú samostatný súbor pre každý záznam. Denník pridáva záznamy do súborov segmentov v `segments/` s limitom `max_segment_bytes` (predvolene 1 MiB) a front pridáva udalosti do jedného `queue.log`. Počet súborov je preto vždy nízky.
