Paměťové limity prohlížeče při zpracování souborů
Můj soubor má jen 15 MB. Proč došla kartě prohlížeče paměť?
Soubor na disku je ta zkomprimovaná verze
Celé nedorozumění se vejde do jedné věty: číslo, které vidíte ve správci souborů, je velikost zkomprimovaných dat, a dokud jsou data zkomprimovaná, nedá se s nimi nic dělat. Aby šlo obrázek zmenšit, znovu zkomprimovat, převést nebo analyzovat, musí se nejdřív dekódovat do surových pixelů — a surové pixely jsou obrovské.
Počty jsou jednoduché. Pixel má v paměti obvykle čtyři bajty — červenou, zelenou, modrou a alfu. Fotografie 4000 × 3000 má dvanáct milionů pixelů, takže dekódovaná bitmapa zabere zhruba 48 MB. JPEG, ze kterého vznikla, mohl mít 4 MB. Soubor se dvanáctkrát zvětšil ještě předtím, než jakákoli práce vůbec začala.
| Rozměry | Pixely | Dekódovaná bitmapa |
|---|---|---|
| 1920 × 1080 | 2,1 milionu | asi 8 MB |
| 4000 × 3000 | 12 milionů | asi 48 MB |
| 6000 × 4000 | 24 milionů | asi 96 MB |
| 10000 × 10000 | 100 milionů | asi 400 MB |
A jedna kopie nikdy nestačí
Reálný zpracovatelský řetězec drží několik kopií najednou: zkomprimované vstupní bajty, dekódovanou zdrojovou bitmapu, výstupní bitmapu v nových rozměrech, interní vyrovnávací paměti kodéru a zkomprimovaný výsledek. Nástroj, který navíc ukazuje náhled, drží ještě jednu. U výše zmíněné fotografie 4000 × 3000 je špičková spotřeba dvou až tří set megabajtů úplně běžná — a to u souboru, který vypadal na 4 MB.
Rasterizace PDF se chová stejně, stránku po stránce: stránka A4 vykreslená ve 300 DPI má zhruba 2480 × 3508 pixelů, tedy asi 35 MB v dekódované podobě, a nástroj, který vykresluje několik stránek naráz, to násobí. U videa je to ještě horší, protože dekodér musí mít v paměti současně několik referenčních snímků.
Kde jsou skutečné stropy
- Paměťový rozpočet karty určuje prohlížeč, ne webová stránka, a je menší než paměť nainstalovaná v počítači. Navíc se zmenšuje, když mají ostatní karty práci.
- Moduly WebAssembly sestavené pro běžný 32bitový paměťový model umějí adresovat nejvýše čtyři gibibajty a prohlížeče na jednu instanci často povolí výrazně méně.
- Jednotlivé vyrovnávací paměti mají vlastní maximální délku, která je hluboko pod celkovou pamětí, jakou stránka smí využít.
- Mobilní operační systémy kartu, která příliš naroste, ukončí — bez varování a bez chyby, kterou by stránka mohla zachytit.
- Grafická paměť je samostatná a menší zásoba. Canvas větší než maximální rozměr dané platformy prostě selže, ať je systémové paměti volné jakkoli mnoho.
Ani jedna z těchto hranic není zveřejněná jako jediné číslo, které by šlo dohledat, protože závisí na prohlížeči, jeho verzi, zařízení a na tom, co dalšího zrovna běží. V tom je ta skutečná potíž: nástroj se nemá jak zeptat, kolik paměti smí použít.
Proč jsou telefony ten přísný případ
Telefony mají méně fyzické paměti, nemají odkládací prostor v tom smyslu jako počítače a jejich operační systém ji procesům na pozadí zabírá zpět velmi agresivně. A karta prohlížeče je proces na pozadí v okamžiku, kdy odpovíte na zprávu. Mobilní prohlížeče proto drží přísnější rozpočty a kartu zahodí dřív — a to zahození se vám obvykle neprojeví jako chyba, ale tak, že se stránka znovu načte a vaše práce je pryč.
Praktický důsledek je ten, že úloha, která na notebooku doběhne, může být se stejným souborem na telefonu nemožná. Není to vada nástroje. Je to hranice hardwaru a poctivá reakce je říct to předem, ne spadnout v polovině.
Jak se chová obezřetný nástroj
- Ještě než cokoli alokuje, odhadne spotřebu paměti z dekódovaných rozměrů a úlohu, která se zjevně nevejde, odmítne.
- Na slabším zařízení zpracovává jeden soubor po druhém místo toho, aby dávku hnal paralelně.
- Vyrovnávací paměti mezi stránkou a jejími workery předává, místo aby je kopíroval, takže velký soubor neexistuje dvakrát.
- Každý výsledek uvolní hned, jakmile je zapsaný, a zruší dočasné URL, které by data jinak držely naživu.
- Tam, kde to formát dovolí, zpracovává data proudově po stránkách nebo po snímcích místo toho, aby celý dokument načetl do paměti.
- Omezuje počet pixelů, který je ochoten přijmout, což je zároveň to, co brání malému souboru rozbalujícímu se do obrovského plátna položit celou kartu.
Co dělat, když úloha selže
- Zavřete ostatní karty. Soupeří o stejný rozpočet a prohlížeče ho nedělí spravedlivě.
- Zpracovávejte méně souborů naráz. Fronta o jednom je pomalejší, ale doběhne mnohem spolehlivěji.
- Nejdřív zmenšete rozměry. Poloviční délka nejdelší hrany sníží spotřebu paměti na čtvrtinu a často je to stejně to, co jste chtěli.
- Velké PDF rozdělte a zpracujte po částech.
- Na největší úlohy přejděte na stolní počítač. Není to selhání lokálního zpracování, ale správné využití hardwaru, který máte.
- Pokud je karta otevřená celé dny, restartujte prohlížeč. Dlouho běžící karty hromadí paměť, kterou znovunačtení uvolní.
Kam sahá jakýkoli odhad
Prohlížeče o dostupné paměti prozradí jen hrubé vodítko a některé neprozradí vůbec nic. Každé číslo, které vám lokální nástroj ukáže, je proto odhad postavený na rozměrech samotného souboru a na konzervativním modelu zpracování, ne údaj přečtený z operačního systému. Hodí se k rozhodnutí, jestli se do úlohy vůbec pouštět. Není to slib, že úloha doběhne, protože rozhodující faktor — co bude zbytek zařízení dělat v příštích třiceti sekundách — webová stránka nevidí.
Nástroje k tomuto tématu
Zdroje
- W3C — WebAssembly Core Specification, memory model
- W3C — Device Memory API, and why the value is coarse
- WHATWG — HTML Standard, transferable objects