Infrastructura de cache
HotPDF oferă o memorie cache ponderată cu limită de dimensiune pentru obiecte intermediare reutilizabile și un cache persistent de pagini randate utilizat la randarea documentelor încărcate
Memoria cache ponderată
THPDFWeightedCache din HPDFCache deține valori TObject, le indexează după AnsiString și elimină valorile cel mai puțin recent utilizate până când greutatea lor cumulată se încadrează în MaxBytes
GetșiTryGetpromovează o potrivire la cel mai recent utilizată și actualizează statisticile de cereriPeekșiContainsKeyinspectează intrările fără a modifica recența sau statisticile de cereriPutpreia proprietatea, înlocuiește o cheie existentă pe loc și acceptă în siguranță din nou același obiect atunci când îi cambiă doar greutateaRemoveeliberează o intrare, în timp ceExtracttransferă proprietatea către apelant- Reducerea
MaxByteselimină intrările imediat, iarTrimToBudgetexpune explicit aceeași operațiune de convergență Hits,Misses,HitRate,Evictions,RejectionsșiReplacementsexpun comportamentul cache-ului, în timp ceResetStatisticsîncepe un nou interval de măsurare- Capacitatea sloturilor crește geometric, iar intrările active rămân legate în ordine de recență cu timp constant
Chei de conținut
function HPDFCacheKeyOfBytes(const Bytes: TBytes): AnsiString;
function HPDFCacheKeyOfStream(Stream: TStream): AnsiString;
Ambele funcții returnează aceeași cheie hexazecimală SHA-256 în minuscule pentru același conținut
HPDFCacheKeyOfStream calculează hash-ul fără a aloca un al doilea tablou de octeți de dimensiune completă, citește fluxurile căutabile de la poziția zero și le restabilește poziția originală
Cache persistent de pagini randate
Fiecare instanță THotPDF reține decodoarele de fonturi încărcate parsate cu succes într-un cache LRU ponderat, în scopul documentului
- Bugetul implicit este de 32 MiB, cu o limită dură de 128 de intrări, iar un buget de zero octeți dezactivează reținerea
- Dicționarele de fonturi indirecte partajate reutilizează un singur nucleu parsat între pagini, chiar și când paginile folosesc nume de resurse diferite
- Extracția de text, exportul SVG, înlocuirea textului încărcat și cererile explicite de decodor partajează același cache
GetLoadedFontDecodercopiază în profunzime tablourile gestionate, astfel încât apelanții nu pot muta mapările sau lățimile din cache- Reîncărcarea documentului, mutarea grafului, invalidarea paginilor, JSON Patch și fiecare atribuire
CMapResourcePathșterg decodoarele reținute - Obținerea decodorului este serializată per document, pentru a evita parsarea duplicată a aceluiași font, dar lock-ul nu face sigură mutarea concurentă a documentului
GetLoadedFontDecoderCacheInfoexpune intrările, octeții estimați, bugetul, hit-urile, miss-urile, parsările, eliminările și invalidările
Cache de decodare a imaginilor încărcate, pe shard-uri
Fiecare instanță THotPDF coordonează reutilizarea decodării imaginilor încărcate prin 16 shard-uri de metadate cu lock independent
- Căutarea în cache și admiterea rețin doar shard-ul selectat, în timp ce decodarea costisitoare de filtre și de imagini rulează în afara lock-urilor de cache
- Un singleflight exact per cheie alege un singur decodor proprietar și face ca apelanții duplicați să aștepte același rezultat finalizat
ImageCacheMaxBytesconfigurat, limita de număr de intrări și limita per intrare rămân globale pe toate shard-urile- Intrările de imagini decodate rețin handle-uri imutabile cu numărare de referințe care supraviețuiesc eliminării și permit renderelor să deseneze hit-uri calde fără a materializa o copie
TBitmap - Imaginile finalizate sunt copiate în instanțe
TBitmapdeținute de apelant, astfel încât apelanții nu pot muta pixelii reținuți în cache - Reîncărcarea documentului și invalidarea cache-ului de imagini șterg intrările finalizate, în timp ce obiectele de zbor active își păstrează propria durată de viață cu numărare de referințe
GetImageDecodeConcurrencyInforaportează zborurile active, decodările proprietare active și de vârf, așteptările, finalizările și eșecurile
Cache de transformări ICC
HPDFICC partajează transformări complete de la sursă la sRGB printr-un cache LRU ponderat, thread-safe, de 64 MiB, inclusiv profilurile de proof și de ieșire când sunt configurate
- Cheia SHA-256 acoperă conținutul complet al profilurilor sursă, de proof și de ieșire, intenția efectivă de randare și setarea de compensare a punctului negru
HPDFGetICCTransformCacheInforaportează hit-uri, miss-uri, eliminări, respingeri, număr de intrări, octeți curenti și octeți maximiHPDFSetICCTransformCacheMaxBytesaplică imediat un nou buget la nivel de proces și elimină la nevoie transformările cel mai puțin recent utilizateHPDFClearICCTransformCacheeliberează transformările reținute și resetează statisticile de cereri, fără a invalida interfețele de transformare deja deținute de apelanți
Cache persistent de subseturi de fonturi
Setați THotPDF.FontSubsetCacheFolder pentru a activa rezultate reutilizabile de subsetare TrueType și OpenType cât timp EnableFontSubsetting este activ
- Cheia acoperă octeții originali ai fontului, bitmap-ul exact al glifelor folosite, modul compact sau sparse și versiunea schemei de cache
- Atât calea obișnuită de stocare GDI a fonturilor, cât și finalizer-ul înregistrat de fonturi Unicode reutilizează același cache
- Intrările compacte PDF/A păstrează harta GID de la vechi la nou și noul număr de glife necesare
CIDToGIDMap - Intrările sunt validate înainte de folosire, intrările corupte sunt eliminate, iar înlocuirea folosește o mutare atomică în același dosar
FontSubsetCacheMaxBytesse aplică imediat și elimină fișierele exacte de cache accesate cel mai puțin recent, fără a parcurge dosare fără legăturăGetFontSubsetCacheInforaportează hit-uri, miss-uri, scrieri, eliminări, coruperi, respingeri, eșecuri de scriere, octeți și fișiereClearFontSubsetCacheelimină doar intrările de subseturi de fonturi și intrările temporare abandonate din dosarul configurat
PDF.EnableFontSubsetting := True;
PDF.FontSubsetCacheFolder := 'C:\ProgramData\MyApp\HotPDF\FontSubsets';
PDF.FontSubsetCacheMaxBytes := 256 * 1024 * 1024;
Cache persistent de pagini randate
Setați THotPDF.RenderCacheFolder pentru a activa nivelul pe disc utilizat după cache-ul de pagini randate din memorie
- Fișierele de pagină sunt indexate după conținutul documentului, indexul paginii bazat pe zero, DPI, vizibilitatea efectivă a conținutului opțional, intenția de culoare și politica de rezervă
- Schimbările de strat și de intenție de culoare selectează variante de stare reutilizabile, în loc să arunce fiecare bitmap din cache
- Actualizările PNG și de index sunt atomice, iar fișierele temporare abandonate sunt eliminate în timpul recuperării
- Citirile paginilor reîmprospătează recența la nivel de pagină, în timp ce numărul de documente, numărul de pagini și limitele de octeți elimină datele cel mai puțin recent utilizate
- Reducerea unei limite configurate converge imediat, în loc să aștepte o scriere ulterioară
- Fișierele PNG corupte, rândurile de index învechite sau duplicate, dosarele lipsă și dosarele de cache neindexate sunt reparate automat
- Cheile și coordonatele de document nevalide sunt respinse înainte de accesul la sistemul de fișiere
- Dosarele de document legate simbolic sunt omise în timpul recuperării, al citirilor, scrierilor, invalidării și eliminării; linkurile și fișierele țintă externe ale lor sunt păstrate
Proprietate
THPDFWeightedCachedeține valorile transmise cătrePut, cu excepția cazului în care o valoare este returnată deExtractTHPDFDiskPageCache.Lookupreturnează un bitmap nou alocat, deținut de apelant- Valorile bitmap transmise către
THPDFDiskPageCache.Storerămân deținute de apelant
API-uri asociate
- Cache persistent de subseturi de fonturi
- THotPDF.LoadedFontDecoderCacheMaxBytes
- THotPDF.GetLoadedFontDecoderCacheInfo
- Cache de decodare a imaginilor încărcate, pe shard-uri
- THotPDF.GetImageDecodeConcurrencyInfo
- THotPDF.RenderCacheFolder
- THotPDF.RenderCacheMaxDocuments
- THotPDF.RenderCacheMaxBytes
- THotPDF.RenderLoadedPageToBitmapCached
- Diagnostice de randare și telemetrie de operații