Skip to content

JakubOnderka/Btree-file-journal

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 

Repository files navigation

Btree file journal
===================

Souborový žurnál určený k ukládání tagů a priorit kešovaných souborů. V budoucnu by mohl nahradit v současné době používaný žurnál. Ten je sice při jedontlivých zápisech velmi rychlý, protože data pouze ukládá na konec logu, problém nastane v případě, že velikost tohot logu překročí definovanou mez a začně se vytvářet trvalý soubor, což trvá velmi dlouho. Oproti tomu Btree žurnál log nepoužívá a vše ukládá již přímo na své místo. Proto například zvládne ukládat kolem 90 požadavků za sekundu, současný žurnál pouze 3 při konkurenci 10.

I výběr a mazání je mnohem rychlejší, vyhledávání totiž probíhá pomocí datové struktury B+ stromu, kterou použivájí prakticky všechny databáze a souborové systémy. Navíc položky se nesmaží hned, pouze se označí jako smazané. To proto, že velmi často dojde k tomu, že ta samá položka bude do databáze zapsána znovu. Pokud se tak nestane, bude smazána při příštím mazání. 

Nejen rychlost je jedniná výhoda: Současná implementace totiž neodstaňuje závilosti. To znamená, že pokud do žurnálu vložíme položku označenou dvěma rozdílnými tagy a jeden z nich smažeme, položka zůstane i nadále dostupná pod druhým z nich. Tento nový žurnál položku kompletně odstraní včentě všech závislostí.

A v čem ještě spočívá tajemství rychlosti?
- Data se ukládájí do bloků o velikosti 4 kiB, což je taktéž velikost bloku na dnešních discích, což je nejlepší velikost pro načítání a ukládání dat.
- Pole nejsou ukládána v binárním formátu, ale jako serializovaná (buď pomocí funkce serialize nebo json_encode), což je v PHP bohužel rychlejší.
- Při mazání podle priority je využita vlastnost B+ stromu a to, že odkazuje na předcházející blok, takže se nemusí znovu procházet od vrcholu celý strom.
- Jako hashovací funkce pro je použita funkce crc32. Ta sice není na tento účel použití stavěná, což znamená že nebude tak unikátní jako jiné funkce, zato je velmi rychlá.
- Je použita keš po ukládání již načtených nodů. V případě změny souboru jiným procem je keš invalidována, aby byla zajištěna konzistentnost žurnálu.
- Všechny časti prošly velmi pečlivou optimalizací za použití profileru XHProf. Například pokud připojujeme jedno pole k druhému, je rychlejší použít foreach než array_merge.

TODO:
- Není implementováno žádné vyvažování stromu, což může v nejhorším případě znamenat exponenciální časovou složitost. 
- S keší není pracováno inteligetně, tedy při velmi velkém indexu může docházet k využití velkého množství paměti.

Použití
===================
Pokud chcete použít nebo otestovat tento žurnál, stačí nakopírovat soubor BtreeFileJournal.php do složky Nette\Caching a poté přidat do souboru bootstrap.php vašeho projektu následující řádky:
Environment::getContext()
        ->addService(
                'Nette\\Caching\\ICacheJournal',
                new Nette\Caching\BtreeFileJournal(
                        Environment::getVariable('tempDir')
                )
        );
        
Tato verze je určena pouze pro PHP 5.3.0 a vyšší (využívá jmenné prostory) a i v případě méně závažných chyb vyhazuje výjimky a zatím tedy není vhodná pro ostré nasazení. 

V případě jakýchkoliv dotazů nebo nalezených chyb mne prosím kontaktujte. 

About

File journal based on Btree+ structure for Nette\Caching.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages