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