HotPDF voi pitää TrueType- ja OpenType-fonttiosajoukot levyllä ja käyttää niitä uudelleen asiakirjojen ja prosessiajojen yli, jolloin erä joka renderöi kymmenentuhatta tiliotetta samoilla kolmella fontilla osajoukistaa ne fontit kerran sen sijaan että kymmenentuhatta kertaa. Välimuisti määritetään kahdella ominaisuudella, tarkastetaan yhdellä tietueella, ja sen voi jättää turvallisesti päälle: välimuistihäiriö putoaa normaaliksi muistissa tapahtuvaksi osajoukistamiseksi eikä koskaan pysäytä asiakirjan tuottamista
Osajoukistaminen on kallista syystä. Osajoukon rakentaminen tarkoittaa glyfisulkeuman kävelyä, loca:n ja glyf:n uudelleenkirjoittamista, cmap:n ja hmtx:n uudelleenrakentamista ja CID-kartoituksen emitointia jota PDF voi osoittaa. Yhdelle asiakirjalle tuo katoaa meluun. Raporttipalvelimelle joka tuottaa asiakirjoja silmukassa se on usein suurin yksittäinen suoritinaikaerä ajossa
Mikä tekee välimuistiosumasta mahdollisen
Neljän asian on täsmättävä: fonttisisältö, käytettyjen glyfien joukko, osajoukkotila ja välimuistin skeema. Jos yksikin puuttuu HotPDF osajoukistaa tyhjästä, koska osajoukko on uudelleenkäytettävä vain silloin kun se olisi ollut tavutasolla identtinen joka tapauksessa
Glyfijoukko on se ehto joka yllättää ihmisiä. Kaksi laskua jotka eroavat yhdellä asiakkaan nimellä käyttävät eri glyfijoukkoja, ja tuottavat siksi eri osajoukot ja eri välimuistimerkinnät. Välimuisti maksaa itsensä takaisin kun asiakirjat jakavat glyfivalikoiman — tiliotteet kiinteältä pohjalta, lomakkeet joiden muuttuja on numeerinen, luettelot jotka on piirretty yhdestä tuotetietokannasta — eikä maksa mitään kun jokainen asiakirja piirtää eri siivun suuresta CJK-fontista. Mittaa ennen kuin oletat kummassa tapauksessa olet
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;
Mistä tiedät että välimuisti tekee yhtään mitään?
GetFontSubsetCacheInfo palauttaa yhdeksän laskuria, ja kahden ensimmäisen suhde vastaa kysymykseen suoraan. HitCount ja MissCount antavat osuneisuuden. WriteCount ja EvictionCount näyttävät säilyvätkö merkinnät tarpeeksi pitkään uudelleenkäytettäviksi vai työnnetäänkö niitä ulos liian pienellä budjetilla. CurrentBytes ja FileCount raportoivat mitä levyllä on juuri nyt
Jäljellä olevat kolme ovat ne joihin kannattaa hälyyttää. CorruptCount laskee merkinnät jotka epäonnistuivat validoinnissa ja poistettiin — muutama epäpuhtaan sammutuksen jälkeen on normaalia, jatkuva virta tarkoittaa että tallennus on epäluotettava. RejectedCount laskee merkinnät jotka kieltäydyttiin ennen käyttöä. WriteFailureCount laskee merkinnät joita ei voitu kirjoittaa lainkaan, mikä yleensä tarkoittaa oikeusongelmaa kansiossa eikä mitään fontteihin liittyvää. Mikään näistä kolmesta ei pysäytä asiakirjan tuotantoa, mikä on juuri syy miksi sinun pitää katsoa niitä: välimuisti joka hiljaa ei koskaan kirjoita näyttää ulospäin samalta kuin välimuisti joka toimii, paitsi CPU-laskun osalta
Poisto, budjetit ja hetki jona kavennat yhtä
FontSubsetCacheMaxBytes:n oletus on 268435456 tavua, eli 256 MiB, ja sitä voi alentaa ajonaikaisesti. Alentaminen laukaisee välittömän vähiten-viimeksi-käytetyn poiston sen sijaan että odottaisi seuraavaa kirjoitusta, joten palvelu joka reagoi levyntäyteyteen voi vapauttaa tilaa hetkellä jolloin se päättää tehdä sen, ei jossain myöhemmässä pisteessä jota se ei hallitse
FontSubsetCacheFolder:n asettaminen tyhjäksi merkkijonoksi ottaa levykerroksen pois käytöstä tyhjentämättä mitään jo tallennettua, ja muuttamatta yhtäkään fonttitulosteen tavua. Tämä on ominaisuus johon tarttua kun haluat eristää välimuistin vianmäärityksen aikana: kytke se pois, aja sama erä ja vertaa tuotettuja PDF:ejä. Niiden pitäisi olla identtisiä, koska välimuisti tallentaa tuloksen eikä käytäntöä
Mitä välimuisti tekee kun merkintä on vaurioitunut
Se poistaa sen ja osajoukistaa normaalisti. Väärin muodostetut tai typistyneet merkinnät hylätään ennen kuin osajoukko voi päästä PDF-virtaan, mikä on osa suunnittelua joka merkitsee eniten: vaurioitunut välimuistimerkintä joka pääsisi asiakirjaan tuottaisi PDF:n jolla on rikkonainen fonttiohjelma, ja tuo virhe nousisi esiin kaukana syytään — katselimessa, asiakkaan koneella, viikkoja myöhemmin
Kirjoitukset ovat atomisia, joten lukija ei koskaan havaitse puoliksi kirjoitettua merkintää, ja kaatuminen kesken kirjoituksen jättää välimuistin eheäksi eikä myrkytetyksi. Tiiviit osajoukkomerkinnät säilyttävät CID-uudelleenkartoitusdatan jota PDF/A-fonttisanakirjat vaativat, joten välimuistissa oleva osajoukko on yhä vaatimustenvastainen osajoukko — arkistotulosteen ei tarvitse ohittaa välimuistia pysyäkseen kelvollinen
// 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');
Mihin sijoittaa kansio oikeassa käyttöönotossa
Kolme ominaisuutta päättää tämän: kansion on oltava kirjoitettava tilillä jonka palvelu ajaa, sen pitäisi olla paikallisessa tallennuksessa eikä verkkolevyssä, ja sen ei pitäisi olla hakemiston sisällä jonka käyttöönottoaskel pyyhkii. Välimuisti jaetussa levyssä muuttaa jokaisen ohi menon edestakaisksi matkaksi ja jokaisen osuman kahdeksi; välimuisti sovelluskansion alla jonka asennin luo uudelleen on välimuisti joka aloittaa kylmänä jokaisen päivityksen jälkeen
Moni-instanssipalveluita varten anna kullekin instanssille oma kansio ellet ole vahvistanut että tallennus käsittelee samanaikaisen atomisen korvaamisen odottamallasi tavalla. Tuplatun merkinnän hinta on yksi ylimääräinen osajoukistusläpäisy; jaetun välimuistin kilpailutilanteen vianmäärityksen hinta on iltapäivä
Milloin tarttua johonkin muuhun
Välimuisti vähentää toistotyötä. Se ei vähennä ensimmäisen asiakirjan työtä, eikä se auta kuormaa jonka glyfijoukot eivät koskaan toistu. Jos tulosteesi hallitsee yksi valtava CJK-fontti jota käytetään ennakoimattoman tekstin yli, tehokkaampi vipu on osajoukistussulkeuma itse — mitkä glyfit vedetään mukaan ja miksi — mistä käsitellään muistiinpanoissa fonttiosajoukon sulkeuma ja glyfien muotoilu. Jos eräsi on hidas syistä jotka osoittautuvat ei-fonteiksi lainkaan, artikkeli raporttituloste fonteilla ja kuvilla näyttää mihin muu aika yleensä menee, ja tapaustutkimus EndDoc-fonttiosajoukon järjestysvirhe muistuttaa että osajoukistuksen oikeellisuus ja osajoukistuksen nopeus ovat erilliset ongelmat
HotPDF on natiivi VCL PDF -komponentti Delphille ja C++Builderille, ja osajoukkovälimuisti on osa kirjastoa eikä lisäosapalvelu, joten raporttipalvelin saa sen asettamalla yhden kansion polun — katso HotPDF-komponenttisivulta koko fontti- ja suorituskykyominaisuusluettelo