Tehnični članak

Predpomnjenje podmnožic pisav na disku s HotPDF v Delphiju

HotPDF lahko drži podmnožice pisav TrueType in OpenType na disku in jih ponovno uporabi med dokumenti in med teki procesa, tako paket, ki upodobi deset tisoč izpiskov z istimi tremi pisavami, te pisave podmnožiči enkrat in ne deset tisočkrat. Predpomnilnik nastavljate z dvema lastnostma, pregledujete z enim zapisom in varno pustite vklopljen: napaka predpomnilnika pade nazaj na običajno podmnožičenje v pomnilniku in nikoli ne zaustavi proizvodnje dokumenta

Podmnožičenje je draga operacija iz razloga. Gradnja podmnožice pomeni sprehod po zaprtju glasov, ponovni zapis loca in glyf, ponovno gradnjo cmap in hmtx in oddajo preslikave CID, ki jo lahko PDF naslovi. Pri enem dokumentu ta strošek izgine v šumu. Pri poročilnem strežniku, ki proizvaja dokumente v zanki, je to pogosto največji posamični blok časa CPU v teku

Kaj omogoča zadetek predpomnilnika

Štiri stvari se morajo ujemati: vsebina pisave, množica uporabljenih glasov, način podmnožice in shema predpomnilnika. Katerikoli zamudite in HotPDF podmnoži iz ničle, ker je podmnožica ponovno uporabna le, ko bi bila tako ali tako bajtno identična

Množica glasov je pogoj, ki ljudi preseneti. Dva računa, ki se razlikujeta z eno samo imena stranke, uporabljata različni množici glasov in zato proizvedeta različni podmnožici in različna vnosa predpomnilnika. Predpomnilnik se izplača, ko dokumenti delijo repertoar glasov — izpiski iz fiksne predloge, obrazci, katerih spremenljivi podatki so številski, katalogi, povlečeni iz ene podatkovne baze izdelkov — in ne donese nič, ko vsak dokument riše drugačen rez velike pisave CJK. Izmerite, preden privzamete, v katerem primeru ste

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 veste, da predpomnilnik sploh kaj dela?

GetFontSubsetCacheInfo vrne devet števcev, razmerje med prvima dvema pa neposredno odgovarja na vprašanje. HitCount in MissCount dasta stopnjo zadetkov. WriteCount in EvictionCount pokažeta, ali vnosi dovolj dolgo preživijo, da so ponovno uporabljeni, ali pa jih izriva proračun, ki je premajhen. CurrentBytes in FileCount poročata, kaj je na disku prav zdaj

Preostali trije so tisti, na katere se splača opozarjati. CorruptCount šteje vnose, ki niso uspeli pri validaciji in so bili odstranjeni — nekaj po nečistem izklopu je normalno, enakomeren tok pa pomeni, da shramba ni zanesljiva. RejectedCount šteje vnose, zavrnjene pred uporabo. WriteFailureCount šteje vnose, ki jih sploh ni bilo mogoče zapisati, kar običajno pomeni težavo z dovoljenji mape in ne karkoli o pisavah. Noben od teh treh ne zaustavi generacije dokumenta, kar je natanko razlog, zakaj jih morate pogledati: predpomnilnik, ki tiho nikoli ne zapisuje, je od zunaj videti enak predpomnilniku, ki deluje, razen po računu za CPU

Izločanje, proračuni in trenutek, ko enega skrčite

FontSubsetCacheMaxBytes je privzeto 268435456 bajtov, to je 256 MiB, in ga je mogoče znižati med izvajanjem. Znižanje sproži takojšnje izločanje najdlje uporabljenih namesto čakanja na naslednji zapis, tako lahko storitev, ki reagira na pritisk na disku, prosti prostor v trenutku, ko se odloči, in ne kasneje, ko ne nadzira

Nastavitev FontSubsetCacheFolder na prazen niz onemogoči diskovno raven brez brisanja česarkoli že shranjenega in brez spremembe enega samega bajta izhoda pisave. To je lastnost, po katero sežete, ko želite izolirati predpomnilnik med odpravljanjem težav: izklopite ga, zaženite isti paket in primerjajte proizvedene datoteke PDF. Biti morajo identične, ker predpomnilnik shranjuje rezultat in ne politiko

Kaj stori predpomnilnik, ko je vnos poškodovan

Odstrani ga in podmnoži običajno. Nepravilno oblikovani ali prirezani vnosi so zavrnjeni, preden lahko podmnožica seže v tok PDF, kar je del zasnove, ki šteje največ: poškodovan vnos predpomnilnika, ki bi prišel v dokument, bi proizvedel PDF z zlomljenim programom pisave in ta napaka bi se pokazala daleč od svojega vzroka — v bralniku, na stroju stranke, tedne pozneje

Zapisi so atomarni, tako bralec nikoli ne opazuje napisanega na pol vnosa, zrušitev sredi zapisa pa pusti predpomnilnik dosleden namesto zastrupljen. Kompaktni vnosi podmnožic ohranijo podatke o preslikavi CID, ki jih zahtevajo slovarji pisav PDF/A, tako da je predpomnjevana podmnožica še vedno skladna podmnožica — arhirski izhod se ne mora izogniti predpomnilniku, da bi ostal veljaven

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

Kam postaviti mapo v resnični uvedbi

Tri lastnosti odločajo o tem: mapa mora biti zapisljiva za račun, pod katerim teče storitev, mora stati na lokalni shrambi in ne na omrežnem deljenem disku, in ne sme biti znotraj mape, ki jo korak uvedbe pobriše. Predpomnilnik na deljenem disku spremeni vsak zgrešeni zadetek v povratni klic in vsak zadetek v dva; predpomnilnik pod mapo aplikacije, ki jo namestilnik znova ustvari, je predpomnilnik, ki se po vsaki posodobitvi začne hladno

Za storitve z več primerki dajte vsakemu primerku svojo mapo, razen če ste potrdili, da shramba obravnava sočasno atomarno zamenjavo tako, kot pričakujete. Strošek podvojenega vnosa je ena dodatna pase podmnožičenja; strošek razhroščevanja dirke deljenega predpomnilnika je eno popoldne

Kdaj seči po nekaj drugem

Predpomnilnik zmanjšuje ponavljajoče se delo. Ne zmanjšuje dela prvega dokumenta in ne pomaga obremenitvi, katere množice glasov se nikoli ne ponavljajo. Če vaš izhod prevladuje ena ogromna pisava CJK, uporabljena čez nepredvidljivo besedilo, je učinkovitejša ročka zaprtje podmnožice samo — kateri glasovi se povlečejo in zakaj — kar obravnavajo zapiski o zaprtju podmnožice pisav in oblikovanju glasov. Če je vaš paket počasen iz razlogov, ki se izkažejo, da niso pisave, sprehod skozi izhod poročil s pisavami in slikami pokaže, kam gre drugi čas običajno, študija primera o hrošču vrstnega reda podmnožic pisav EndDoc pa opomin, da sta pravilnost podmnožičenja in hitrost podmnožičenja ločeni težavi

HotPDF je izvorna komponenta PDF VCL za Delphi in C++Builder, predpomnilnik podmnožic pa je del knjižnice in ne dodatna storitev, tako da ga poročilni strežnik dobi z nastavitvijo ene poti mape — glejte stran komponente HotPDF za popoln seznam pisavnih in zmogljivostnih lastnosti