Tehnički članak

Predmemoriranje podskupova fontova na disku s HotPDF-om u Delphiju

HotPDF može držati podskupove TrueType i OpenType fontova na disku i ponovno ih koristiti kroz dokumente i kroz pokretanja procesa, pa serija koja renderira deset tisuća izvoda s ista tri fonta podskupljuje te fontove jednom umjesto deset tisuća puta. Predmemorija se konfigurira s dva svojstva, pregledava jednim zapisom i sigurno ju je ostaviti uključenu: neuspjeh predmemorije pada natrag na obično podskupljenje u memoriji i nikad ne zaustavlja proizvodnju dokumenta

Podskupljenje je skupo s razlogom. Izgradnja podskupa znači obilazak zatvaranja glifova, prepisivanje loca i glyf, ponovnu izgradnju cmap i hmtx te emitiranje CID preslikavanja koje PDF može adresirati. Za jedan dokument ta se cijena izgubi u šumu. Za poslužitelj izvješća koji proizvodi dokumente u petlji često je to najveći pojedinačni blok CPU vremena u pokretanju

Što omogućuje pogodak u predmemoriji

Četiri se stvari moraju podudarati: sadržaj fonta, skup korištenih glifova, način podskupa i shema predmemorije. Promašite bilo koju i HotPDF podskupljuje iz početka, jer je podskup za ponovnu uporabu samo kad bi bio bajtno-identičan ionako

Skup glifova uvjet je koji iznenađuje ljude. Dvije fakture koje se razlikuju po jednom imenu kupca koriste različite skupove glifova, stoga proizvode različite podskupove i različite unose predmemorije. Predmemorija se isplati kad dokumenti dijele repertoar glifova, izvodi iz fiksnog predloška, obrasci čiji su varijabilni podaci numerički, katalozi izvučeni iz jedne baze proizvoda, a ne isplati se ništa kad svaki dokument crta drukčiji izrez velikog CJK fonta. Izmjerite prije nego što pretpostavite u kojem 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;

Kako znati radi li predmemorija išta?

GetFontSubsetCacheInfo vraća devet brojača, a omjer između prva dva izravno odgovara na pitanje. HitCount i MissCount daju stopu pogodaka. WriteCount i EvictionCount pokazuju preživljavaju li unose dovoljno dugo za ponovnu uporabu ili ih istiskuje proračun koji je prevelik. CurrentBytes i FileCount prijavljuju što je sad na disku

Preostala tri su oni na kojima se isplati uzbunjivati. CorruptCount broji unose koji nisu prošli provjeru valjanosti i uklonjeni su; nekoliko nakon nečistog gašenja normalno je, stalan tijek znači da pohrana nije pouzdana. RejectedCount broji unose odbijene prije uporabe. WriteFailureCount broji unose koje uopće nije bilo moguće zapisati, što obično znači problem dopuštenja na mapi, a ne išta o fontovima. Nijedno od ova tri ne zaustavlja generiranje dokumenta, što je upravo razlog zašto ih morate pogledati: predmemorija koja šutke nikad ne piše izvana izgleda jednako kao predmemorija koja radi, osim po CPU računu

Izbacivanje, proračuni i trenutak kad jedan smanjite

FontSubsetCacheMaxBytes zadano je 268435456 bajtova, to jest 256 MiB, i može se spustiti u vrijeme izvođenja. Spuštanje pokreće neposredno izbacivanje po načelu najdavnije korištenog umjesto da čeka sljedeće pisanje, tako da servis koji reagira na pritisak na disku može osloboditi prostor u trenutku kad odluči, a ne u nekom kasnijem trenutku koji ne kontrolira

Postavljanje FontSubsetCacheFolder na prazan niz onemogućuje razinu diska bez brisanja ičega već pohranjenog i bez promjene ijednog bajta izlaza fonta. To je svojstvo kojeg se hvatate kad želite izolirati predmemoriju tijekom rješavanja problema: isključite je, pokrenite istu seriju i usporedite proizvedene PDF-ove. Trebali bi biti identični, jer predmemorija pohranjuje rezultat, a ne politiku

Što predmemorija radi kad je unos oštećen

Uklanja ga i podskupljuje normalno. Loše oblikovani ili skraćeni unosi odbijaju se prije nego što podskup može doći do PDF streama, što je dio dizajna koji je najvažniji: oštećen unos predmemorije koji bi ušao u dokument proizveo bi PDF s pokvarenim programom fonta, i taj bi neuspjeh isplivao daleko od svog uzroka, u pregledniku, na stroju kupca, tjednima kasnije

Pisanja su atomična, pa čitatelj nikad ne opaža napola zapisan unos, a prekid usred pisanja ostavlja predmemoriju konzistentnom umjesto otrovanom. Kompaktni unosi podskupa zadržavaju podatke CID premapiranja koje rječnici fontova PDF/A zahtijevaju, pa je predmemorirani podskup i dalje sukladan podskup; arhivski izlaz ne mora zaobilaziti predmemoriju da bi ostao valjan

// 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');

Gdje smjestiti mapu u stvarnoj implementaciji

Tri svojstva odlučuju o ovome: mapa mora biti zapisiva računu pod kojim servis radi, treba sjediti na lokalnoj pohrani umjesto na mrežnom dijeljenju i ne treba biti unutar direktorija koji korak implementacije poništava. Predmemorija na dijeljenju pretvara svaki promašaj u poslužiteljski krug, a svaki pogodak u dva; predmemorija ispod mape aplikacije koju instalacijski program ponovno stvara predmemorija je koja kreće hladna nakon svakog ažuriranja

Za servise s više instanci, dajte svakoj instanci vlastitu mapu osim ako niste potvrdili da pohrana barata atomičnom zamjenom istovremeno onako kako očekujete. Cijena dupliciranog unosa jedan je dodatni prolaz podskupljenja; cijena otklanjanja problema utrke dijeljene predmemorije jedno je poslijepodne

Kad posegnuti za nečim drugim

Predmemorija smanjuje ponovljeni rad. Ne smanjuje rad prvog dokumenta i ne pomaže opterećenju čiji se skupovi glifova nikad ne ponavljaju. Ako vaš izlazom dominira jedan ogroman CJK font korišten na nepredvidljivom tekstu, učinkovitija poluga jest samo zatvaranje podskupljenja, koji se glifovi uvlače i zašto, a pokrivene su u bilješkama o zatvaranju podskupa fonta i oblikovanju glifova. Ako je vaša serija spora iz razloga koji se ispostave da uopće nisu fontovi, prikaz izlaza izvješća s fontovima i slikama pokazuje kamo drugo vrijeme obično ode, a studija slučaja o grešci redoslijeda podskupa fontova pri EndDoc podsjetnik je da ispravnost podskupljenja i brzina podskupljenja jesu odvojeni problemi

HotPDF je izvorna VCL PDF komponenta za Delphi i C++Builder, a predmemorija podskupa dio je knjižnice, a ne dodani servis, pa je poslužitelj izvješća dobiva postavljanjem jedne putanje mape. Pogledajte stranicu HotPDF komponente za cijeli popis značajki fontova i performansi