Tehnički članak

Keširanje podskupova fontova na disku sa HotPDF u Delphi

HotPDF može držati TrueType i OpenType podskupove fontova na disku i ponovo ih koristiti kroz dokumente i kroz pokretanja procesa, tako da paket koji renderuje deset hiljada izvoda sa ista tri fonta radi podskupovanje tih fontova jednom umesto deset hiljada puta. Keš se konfiguriše sa dva svojstva, pregleda jednim zapisom, i bezbedno je ostaviti ga uključenim: neuspeh keša pada na obično podskupovanje u memoriji i nikada ne zaustavlja proizvodnju dokumenta

Podskupovanje je skupo iz razloga. Izgradnja podskupa znači obilazak zatvorenja glifova, prepisivanje loca i glyf, ponovnu izgradnju cmap i hmtx, i emitovanje CID mapiranja koje PDF može adresirati. Za jedan dokument taj trošak nestaje u šumu. Za server izveštaja koji proizvodi dokumente u petlji, to je često najveći pojedinačni blok CPU vremena u pokretanju

Šta čini pogodak keša mogućim

Četiri stvari se moraju poklopiti: sadržaj fonta, skup korišćenih glifova, režim podskupa i šema keša. Promašaj bilo kog i HotPDF radi podskupovanje iznova, jer je podskup ponovo upotrebljiv samo kad bi bio bajt-identičan ionako

Skup glifova je uslov koji iznenađuje ljude. Dve fakture koje se razlikuju u jednom imenu klijenta koriste različite skupove glifova, i zato proizvode različite podskupove i različite keširane unose. Keš se isplati kad dokumenti dele repertoar glifova — izvodi iz fiksne šablone, formulari čiji su promenljivi podaci numerički, katalozi izvučeni iz jedne baze proizvoda — i ne isplati se ništa kad svaki dokument crta drugi isejak velikog CJK lica. Izmerte pre nego što pretpostavite u kom ste slučaju

var
  Pdf: THotPDF;
  Info: THPDFFontSubsetCacheInfo;
begin
  Pdf := THotPDF.Create(nil);
  try
    Pdf.EnableFontSubsetting := True;
    Pdf.FontSubsetCacheFolder := 'C:\ProgramData\Reports\fontcache';
    Pdf.FontSubsetCacheMaxBytes := 64 * 1024 * 1024;   // 64 MiB, default is 256
    // ... generate the batch ...
    Info := Pdf.GetFontSubsetCacheInfo;
    LogFmt('subset cache: %d hits, %d misses, %d bytes in %d files',
      [Info.HitCount, Info.MissCount, Info.CurrentBytes, Info.FileCount]);
  finally
    Pdf.Free;
  end;
end;

Otkud znate da keš uopšte radi nešto?

GetFontSubsetCacheInfo vraća devet brojača, i odnos između prva dva odgovara direktno na pitanje. HitCount i MissCount daju stopu pogodaka. WriteCount i EvictionCount pokazuju da li unosi prežive dovoljno dugo da budu ponovo korišćeni ili ih gura budžet koji je previše mali. CurrentBytes i FileCount prijavljuju šta je na disku upravo sada

Preostala tri su oni na kojima se isplati uzbunjivati. CorruptCount broji unose koji nisu prošli validaciju i uklonjeni su — nekoliko nakon nečistog gašenja su normalni, stalan tok znači da skladište nije pouzdano. RejectedCount broji unose odbijene pre upotrebe. WriteFailureCount broji unose koji uopšte nisu mogli biti zapisani, što obično znači problem dozvola na fascikli a ne išta o fontovima. Nijedno od ovog trojca ne zaustavlja generisanje dokumenta, što je upravo razlog zašto morate gledati ih: keš koji tiho nikada ne piše izgleda spolja isto kao keš koji radi, osim po računu za CPU

Izbacivanje, budžeti i trenutak kad jedan smanjite

FontSubsetCacheMaxBytes podrazumevano je 268435456 bajtova, to jest 256 MiB, i može se spustiti u toku rada. Spuštanje pokreće trenutno izbacivanje najdavnije korišćenog umesto čekanja sledećeg upisa, tako da servis koji reaguje na pritisak na disk može osloboditi prostor u trenutku kad odluči, a ne u nekoj kasnijoj tački koju ne kontroliše

Postavljanje FontSubsetCacheFolder na praznu nisku onemogućava disk sprat bez brisanja bilo čega već uskladištenog, i bez promene jedinog bajta izlaza fonta. To je svojstvo kojeg se prihvatite kad želite izolovati keš tokom rešavanja problema: isključite ga, pokrenite isti paket, i uporedite proizvedene PDF-ove. Treba da budu identični, jer keš čuva rezultat, a ne politiku

Šta keš radi kad je unos oštećen

Uklanja ga i radi podskupovanje normalno. Neoblikovani ili skraćeni unosi se odbijaju pre nego što podskup može dosegnuti PDF tok, što je deo dizajna koji je najvažniji: oštećen keširan unos koji bi dospao u dokument proizveo bi PDF sa slomljenim programom fonta, i taj neuspeh bi isplivao daleko od svog uzroka — u pregledaču, na mašini klijenta, nedeljama kasnije

Upisi su atomični, tako da čitalac nikada ne posmatra polupisan unos, a pad usred upisa ostavlja keš konzistentnim a ne trovanim. Kompaktni unosi podskupa zadržavaju podatke remapiranja CID-a koje rečnici fonta PDF/A zahtevaju, tako da je keširani podskup i dalje usaglašen podskup — arhivski izlaz ne mora zaobilaziti keš da bi ostao validan

// Reset the disk tier after a font upgrade or a schema change
Pdf.ClearFontSubsetCache;

// Or move it somewhere writable and let the budget apply immediately
Pdf.SetFontSubsetCacheFolder('D:\cache\fonts');

Gde smestiti fasciklu u realnoj primeni

Tri svojstva ovo odlučuju: fascikla mora biti pisana od strane naloga pod kojim servis radi, treba da sedi na lokalnom skladištu a ne na mrežnom deljenju, i ne treba da bude unutar direktorijuma koji korak primene briše. Keš na deljenju pretvara svaki promašaj u povratni put, a svaki pogodak u dva; keš ispod fascikle aplikacije koju instalater ponovo kreira jeste keš koji kreće hladan nakon svakog ažuriranja

Za servise sa više instanci, dajte svakoj instanci njen vlastitu fasciklu osim ako niste potvrdili da skladište rukuje istovremenom atomičnom zamenom onako kako očekujete. Cena dupliranog unosa je jedan dodatni prolaz podskupovanja; cena otklanjanja grešaka trke na deljenom kešu je jedno popodne

Kada posegnuti za nečim drugim

Keš smanjuje ponovljeni rad. Ne smanjuje rad prvog dokumenta, i ne pomaže opterećenje čiji se skupovi glifova nikada ne ponavljaju. Ako vaš izlaz dominira jedno ogromno CJK lice korišćeno preko nepredvidivog teksta, efikasnija poluga jeste zatvorenje podskupovanja samo po sebi — koji glifovi se uvlače, i zašto — pokriveno u beleškama o zatvorenju podskupa fonta i oblikovanju glifova. Ako je vaš paket spor iz razloga koji se ispostavi da nisu fontovi uopšte, prolaz kroz izlaz izveštaja sa fontovima i slikama pokazuje gde ostalo vreme obično odlazi, a studija slučaja o bagu redosleda podskupa fonta pri EndDoc je podsetnik da ispravnost podskupovanja i brzina podskupovanja jesu odvojeni problemi

HotPDF je nativna VCL PDF komponenta za Delphi i C++Builder, a keš podskupa je deo biblioteke a ne dodani servis, tako da server izveštaja dobija ga postavljanjem jedne putanje fascikle — pogledajte stranicu HotPDF komponente za kompletnu listu funkcija fonta i performansi