DOPLNĚNO: Algoritmus je nyní licencován pod WTFPLv2. Zdrojové kódy jsou k dispozici na adrese https://github.com/schizofreny/middle-out.
Middle-out komprese už není fiktivní vynález ze seriálu HBO Silicon Valley. Inspirováni televizním seriálem i novými vektorovými instrukčními sadami jsme přišli s novým algoritmem bezeztrátové komprese pro data časových řad. Komprese je vždy o kompromisu mezi rychlostí a poměrem a Nikdy není snadné tyto kompromisy vyvážit, ale celý koncept middle-out nám umožňuje posunout Weissmanovo skóre ještě dál.
Prostě přeruší závislost dat. Pokud potřebujeme předchozí hodnotu k výpočtu aktuální hodnoty, potřebujeme všechny předchozí hodnoty. Pokud však začínáme zpracování z více pozic fragmentu, jsme závislí pouze na antecedentních hodnotách v rámci tohoto fragmentu. To nám umožňuje například efektivně využívat instrukce SIMD.
Jak to funguje?
V principu algoritmus počítá XOR nové a předchozí hodnoty. Tímto způsobem získáme jakýsi rozdíl mezi hodnotami a tento rozdíl můžeme uložit samostatně. V souborech dat časových řad má tento rozdíl obvykle řadu buď počátečních a/nebo koncových nul. Proto je informace, kterou potřebujeme uložit, obvykle podstatně menší, ale musíme také uložit počet předních nul a délku nenulového fragmentu XOR.
Tyto koncepty se obecně používají v současných kompresních algoritmech, např. v algoritmu Gorilla společnosti Facebook . Kvůli efektivitě komprese pracuje Gorilla na úrovni bitů, ale tyto operace jsou poměrně rozsáhlé. Naši kompresi jsme navrhli tak, aby byla co nejrychlejší, takže jsme přešli z bitové na bajtovou granularitu. V důsledku toho by se dal očekávat horší kompresní poměr, ale není tomu tak vždy.
S ohledem na middle-out pracuje komprese na blocích dat, ale to není problém, protože databáze časových řad stejně používají bloky.
Jak je to s kompresním poměrem?
Prozkoumejme kompresní poměr ve dvou různých scénářích. První scénář – vezmeme řadu dvojnásobků (tj. 0,1, 0,2, 0,3, …) a změříme kompresní poměr v závislosti na podílu opakujících se bodů. Pro srovnání použijeme kompresi Gorilla společnosti Facebook. Ve výchozím nastavení Gorilla komprimuje hodnoty i časové značky dat časových řad. Pro účely našeho testu je komprese časových značek vypnuta.
Není překvapivé zjištění, že Gorilla má pro tyto typy dat o něco lepší kompresní poměr. Stejný trend můžeme pozorovat i u dlouhých celočíselných posloupností.
Druhý scénář – datové sady. Datové sady A a B sdílejí stejná minutová skladová data. V případě datové sady A jsou cenové body komprimovány jako čísla s pohyblivou řádovou čárkou. V datasetu B jsou tato čísla nejprve vynásobena, aby se posunula desetinná čárka, a proto můžeme tato čísla reprezentovat jako dlouhá bez ztráty přesnosti.
Tento graf ukazuje propustnost komprese naměřenou na čtyřech sadách dat popsaných výše a navíc propustnost série s příslušným procentem opakujících se hodnot.
Propustnost komprese Gorilla se pohybuje v rozmezí 120-440 MB/s s průměrnou rychlostí 185 MB/s. Nejnižší propustnost naší skalární implementace komprimuje kolem 670 MB/s pro 50 % opakujících se hodnot. To je způsobeno vysokým poměrem chybných předpovědí větví. Průměrná rychlost komprese je 1,27 GB/s. Algoritmus využívající vektorové instrukce netrpí chybnou predikcí větví a komprimuje data od 2,33 GB/s do 2,59 GB/s, přičemž průměrná rychlost je 2,48 GB/s. To není špatné na jedno jádro čipu s frekvencí 2 GHz.
Gorilla dokáže tato data dekomprimovat rychlostí od 100 MB/s do 430 MB/s . Jak ale vidíte, naše dekomprese stejných dat je ještě rychlejší než komprese. Dekomprese bez vektorizace pracuje s minimální rychlostí 2,36 GB/s a průměrnou rychlostí 2,7 GB/s. Vektorizované kódy dekomprimují data od 3,4 GB/s a u datové sady D dosahují 4,86 GB/s. V průměru jsou schopny dekomprimovat data rychlostí 4,0 GB/s.
Průměrné celkové zrychlení komprese je 6,8x (skalární implementace) a 13,4x (vektorizovaná implementace). Průměrné zrychlení pro dekompresi je 16,1x, resp. 22,5x.
O nás
V Schizofrenii se věnujeme výkonu a věříme, že hranice lze vždy posouvat dál. Milujeme výzvy a jsme tu, abychom vám pomohli s vašimi problémy v oblasti HPC.
Část II
www.vldb.org/pvldb/vol8/p1816-teller.pdf
https://github.com/influxdata/influxdb-comparisons/
.